按字母顺序对arraylist排序(不区分大小写)


121

我有一个names包含人名的字符串arraylist 。我想按字母顺序对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

Answers:


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吗?如果比较函数返回整数值,怎么看结果呢?
andro-girl

@seethalakshmi是您列表中的字符串。如果您想获取更多详细信息,请查看Collections.sort方法的来源
denis.solonenko 2011年

我想在logcat中显示排序列表。我该怎么做?
andro-girl

除非您在排序后用循环将列表分解,否则它将显示为对象。for (TYPE newvariable : ARRAYTYPE arrayname) { Log.i("YOURAPPTAG", newvariable); }
被遗弃的购物车

2
@Dante如果您看一下的实现String.CASE_INSENSITIVE_ORDER,那么您会发现A1 less比A10 更脏,只是因为长度较小。没有“自然排序”支持开箱即用,你可能想看看stackoverflow.com/questions/1262239/...
denis.solonenko

195

最简单的操作是:

Collections.sort(list, String.CASE_INSENSITIVE_ORDER);

@djunod,感谢您的回答。我也尝试过从A1到A10的ArrayList解决方案,但是A10不能像denis.solenenko的解决方案那样正确排序。不知何故,A10紧随A1之后。基本上,它的排序方式类似于A1,A10,A2,A3等。为什么会发生这种情况,如何正确排序列表?
但丁2014年

2
@dante,这是正常的字符串排序。如果你想A2来之前A10,你将不得不将其更改为A02,等等
djunod

1
加1.在Android中也可以使用。谢谢,恭喜。
statosdotcom

@djunod非常感谢U :)
Kumar

计算器应该提供我一个选项,保存答案/片断这样的..
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
好答案!我认为,如果将“ implements Comparator”更改为“ implements 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中,任何小写字母都被认为大于任何大写字母。

由于CASE_INSENSITIVE_ORDER考虑"a""A"等于(比较结果为0),。这使得排序不确定。

恕我直言,方法3(使用java.text.Collat​​or)是正确执行此操作的唯一方法,因为它考虑"a"并且"A"不相等,但是会根据当前(或任何其他所需的)区域设置将它们按正确的顺序放置。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.