Сортування масиву в алфавітному порядку (без регістру)


121

У мене є рядковий рядок, namesякий містить імена людей. Я хочу сортувати масив в алфавітному порядку.

ArrayList<String> names = new ArrayList<String>();
names.add("seetha");
names.add("sudhin");
names.add("Swetha");
names.add("Neethu");
names.add("ananya");
names.add("Athira");
names.add("bala");
names.add("Tony");
names.add("Karthika");
names.add("Nithin");
names.add("Vinod");
names.add("jeena");
Collections.sort(names);
for(int i=0; i<names.size(); i++)
    System.out.println(names.get(i));

Я намагався сортувати список вище. Але він відображає відсортований масив як:

Athira
Karthika
..
..
ananya
bala
...

але я не хочу робити це чутливим до регістру. Я хочу, щоб результат був таким:

ananya
Athira
bala

Відповіді:


330

Користувачі Comparatorповинні допомогти

Collections.sort(list, new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        return s1.compareToIgnoreCase(s2);
    }
});

Або якщо ви використовуєте Java 8:

list.sort(String::compareToIgnoreCase);

1
Ви можете сказати мені, що таке рядки s1 і s2? і як можна побачити результат, якщо функція порівняння повертає ціле число.
андро-дівчина

@seethalakshmi - це рядки з вашого списку. Будь ласка, подивіться на джерела методу Collections.sort, якщо ви хочете отримати більш детальну інформацію про це
denis.solonenko

я хочу відобразити відсортований список у logcat.how чи можу це зробити?
андро-дівчина

Він відображатиметься як Об'єкт, якщо ви не розділите список за допомогою циклу після сортування. for (TYPE newvariable : ARRAYTYPE arrayname) { Log.i("YOURAPPTAG", newvariable); }
Покинутий кошик

2
@Dante, якщо ви подивитесь на його реалізацію String.CASE_INSENSITIVE_ORDER, то ви побачите, що А1 обумовлений, lessніж A10 лише тому, що довжина менша. Там немає «природного роду» підтримки з коробки, ви можете захотіти поглянути на stackoverflow.com/questions/1262239 / ...
denis.solonenko

195

Найпростіше це зробити:

Collections.sort(list, String.CASE_INSENSITIVE_ORDER);

@djunod, дякую за відповідь. Я також спробував ваше рішення для ArrayList від A1 через A10, але A10 не сортував правильно, як рішення denis.solenenko. Якось A10 йде за А1. В основному він сортується як A1, A10, A2, A3 і т. Д. Чому це сталося і як я можу правильно сортувати список?
Данте

2
@dante, це звичайне сортування рядків. Якщо ви хочете, щоб A2 вийшов перед A10, вам доведеться змінити його на A02 тощо.
djunod

1
Плюс 1. Працював і в Android. Дякую та вітаю.
statosdotcom

@djunod Дякую У дуже :)
Кумар

stackoverflow повинен надати мені можливість зберегти відповіді / фрагменти на кшталт цього ..
HB.

29

спробуйте цей код

Collections.sort(yourarraylist, new SortBasedOnName());



import java.util.Comparator;
import com.RealHelp.objects.FBFriends_Obj;
import com.RealHelp.ui.importFBContacts;

public class SortBasedOnName implements Comparator
{
public int compare(Object o1, Object o2) 
{

    FBFriends_Obj dd1 = (FBFriends_Obj)o1;// where FBFriends_Obj is your object class
    FBFriends_Obj dd2 = (FBFriends_Obj)o2;
    return dd1.uname.compareToIgnoreCase(dd2.uname);//where uname is field name
}

}

3
Чудова відповідь! Я думаю, що якщо ви зміните "Implementation Comparator" на "рэалізатор Comparator <FBFriends_Obj> і ви зміните типи" Об'єкт "порівняно з FBFriends_Obj, тоді вам не потрібні dd1 і dd2, ви можете використовувати o1 і o2 безпосередньо у звіті про повернення
FrinkTheBrave

11

На підставі вищезазначених відповідей мені вдалося порівняти власні об'єкти класу на зразок цього:

ArrayList<Item> itemList = new ArrayList<>();
...
Collections.sort(itemList, new Comparator<Item>() {
            @Override
            public int compare(Item item, Item t1) {
                String s1 = item.getTitle();
                String s2 = t1.getTitle();
                return s1.compareToIgnoreCase(s2);
            }

        });


3

Починаючи з Java 8 ви можете використовувати Stream:

List<String> sorted = Arrays.asList(
                          names.stream().sorted(
                              (s1, s2) -> s1.compareToIgnoreCase(s2)
                          ).toArray(String[]::new)
                      );

Він отримує потік від цього ArrayList, потім сортує його (ігноруючи випадок). Після цього потік перетворюється на масив, який перетворюється на ArrayList.

Якщо ви друкуєте результат, використовуючи:

System.out.println(sorted);

Ви отримуєте такий вихід:

[ananya, Athira, bala, jeena, Karthika, Neethu, Nithin, seetha, sudhin, Swetha, Tony, Vinod]

3

На жаль, усі відповіді, які поки що не враховують, "a"не повинні вважатися рівними, "A"коли мова йде про сортування.

String[] array = {"b", "A", "C", "B", "a"};

// Approach 1
Arrays.sort(array);
// array is [A, B, C, a, b]

// Approach 2
Arrays.sort(array, String.CASE_INSENSITIVE_ORDER);
// array is [A, a, b, B, C]

// Approach 3
Arrays.sort(array, java.text.Collator.getInstance());
// array is [a, A, b, B, C]

У підході 1 будь-які маленькі літери вважаються більшими, ніж будь-які великі літери.

Підхід 2 робить це гірше, так як CASE_INSENSITIVE_ORDER вважає "a"і "A"рівний (результат Comparation є 0). Це робить сортування недетермінованим.

Підхід 3 (використовуючи java.text.Collator) - єдиний спосіб зробити це IMHO правильно, оскільки він вважає "a"та "A"не рівним, але ставить їх у правильному порядку відповідно до поточного (або будь-якого іншого бажаного) мовного пункту.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.