问题
I have a string arraylist names
which contains names of people. I want to sort the arraylist in alphabetical order.
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));
I tried to sort the list in above way. But it is displaying the sorted array as:
Athira
Karthika
..
..
ananya
bala
...
but I don't want to make it case sensitive. I want the result as:
ananya
Athira
bala
回答1:
Custom Comparator
should help
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return s1.compareToIgnoreCase(s2);
}
});
Or if you are using Java 8:
list.sort(String::compareToIgnoreCase);
回答2:
The simplest thing to do is:
Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
回答3:
try this code
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:
Based on the above mentioned answers, I managed to compare my custom Class Objects like this:
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:
You need to use custom comparator which will use compareToIgnoreCase, not compareTo.
回答6:
Starting from Java 8 you can use Stream:
List<String> sorted = Arrays.asList(
names.stream().sorted(
(s1, s2) -> s1.compareToIgnoreCase(s2)
).toArray(String[]::new)
);
It gets a stream from that ArrayList
, then it sorts it (ignoring the case). After that, the stream is converted to an array which is converted to an ArrayList
.
If you print the result using:
System.out.println(sorted);
you get the following output:
[ananya, Athira, bala, jeena, Karthika, Neethu, Nithin, seetha, sudhin, Swetha, Tony, Vinod]
回答7:
Unfortunately, all answers so far do not take into account that "a"
must not be considered equal to "A"
when it comes to sorting.
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]
In approach 1 any lower case letters are considered greater than any upper case letters.
Approach 2 makes it worse, since CASE_INSENSITIVE_ORDER considers "a"
and "A"
equal (comparation result is 0
). This makes sorting non-deterministic.
Approach 3 (using a java.text.Collator) is IMHO the only way of doing it correctly, since it considers "a"
and "A"
not equal, but puts them in the correct order according to the current (or any other desired) Locale.
来源:https://stackoverflow.com/questions/5815423/sorting-arraylist-in-alphabetical-order-case-insensitive