Сортировка arraylist в алфавитном порядке (без учета регистра)
У меня есть строковый arraylist names
, который содержит имена людей. Я хочу сортировать arraylist в алфавитном порядке.
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
Ответы
Ответ 1
Пользовательский 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);
Ответ 2
Самый простой способ сделать это:
Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
Ответ 3
попробуйте этот код
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
}
}
Ответ 4
На основе вышеупомянутых ответов мне удалось сравнить мои пользовательские объекты класса, подобные этому:
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);
}
});
Ответ 5
Вам нужно использовать пользовательский компаратор, который будет использовать compareToIgnoreCase
, а не сравнивать.
Ответ 6
Начиная с 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]
Ответ 7
К сожалению, все ответы до сих пор не учитывают, что "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"
равными (результат сравнения равен 0
). Это делает сортировку недетерминированной.
Подход 3 (с использованием java.text.Collator) является ИМХО единственным способом сделать это правильно, поскольку он рассматривает "a"
и "A"
не равными, но помещает их в правильном порядке в соответствии с текущим (или любым другим желаемым) ) Локаль.