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

and*_*irl 115 java sorting 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));
Run Code Online (Sandbox Code Playgroud)

我尝试以上述方式对列表进行排序.但是它将排序的数组显示为:

Athira
Karthika
..
..
ananya
bala
...
Run Code Online (Sandbox Code Playgroud)

但我不想让它区分大小写.我希望结果如下:

ananya
Athira
bala
Run Code Online (Sandbox Code Playgroud)

den*_*nko 319

定制Comparator应该有帮助

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

或者如果您使用的是Java 8:

list.sort(String::compareToIgnoreCase);
Run Code Online (Sandbox Code Playgroud)

  • @Dante,如果您看一下String.CASE_INSENSITIVE_ORDER的实现,那么您会发现A1的长度比A10小,因此比A10少。没有开箱即用的“自然排序”支持,您可能想看看http://stackoverflow.com/questions/1262239/natural-sort-order-string-comparison-in-java-is-one内置 (2认同)

dju*_*nod 190

最简单的事情是:

Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
Run Code Online (Sandbox Code Playgroud)

  • @dante,这是正常的字符串排序.如果您希望A2在A10之前到来,则必须将其更改为A02等. (2认同)
  • stackoverflow 应该为我提供一个选项来保存这样的答案/片段。 (2认同)

hac*_*ker 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
}

}
Run Code Online (Sandbox Code Playgroud)

  • 很棒的答案!我想如果你将'implements Comparator'更改为'implements Comparator <FBFriends_Obj>并将比较中的Object类型更改为FBFriends_Obj,那么你不需要dd1和dd2你可以直接在return语句中使用o1和o2 (3认同)

Usm*_*man 10

根据上面提到的答案,我设法比较我的自定义类对象,如下所示:

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);
            }

        });
Run Code Online (Sandbox Code Playgroud)


Lar*_*ner 5

不幸的是,到目前为止,所有答案都没有考虑到排序时"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]
Run Code Online (Sandbox Code Playgroud)

在方法 1 中,任何小写字母都被认为大于任何大写字母。

方法 2 使情况变得更糟,因为 CASE_INSENSITIVE_ORDER 考虑"a"并且"A"相等(比较结果是0)。这使得排序具有不确定性。

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