Java,特殊排序一个 ArrayList,最后有更长的条目
Posted
技术标签:
【中文标题】Java,特殊排序一个 ArrayList,最后有更长的条目【英文标题】:Java, special sort an ArrayList with longer entries at the end 【发布时间】:2013-06-24 23:46:39 【问题描述】:我在 Java 中有一个 ArrayList<String>
。现在我想根据一些要求对其进行排序。
例如,我在 ArrayList 中有这些项目:
xyz
bcd
abc_locked
cde
efg_locked
fgh
我想推回最后带有_locked
的那些并保持顺序,以便:
xyz
bcd
cde
fgh
abc_locked
efg_locked
最好的方法是什么?我是否必须遍历列表删除字符串并再次添加它?还是有更好的方法?
【问题讨论】:
你有没有尝试过? 提示:Collections.sort(yourList, customComparator);
vogella.com/articles/JavaCollections/#collectionssort
@M4tchB0X3r:如果你展示你的尝试,我相信有人会愿意帮助你。但是,在你不付出任何努力的情况下完成你的工作可能不会发生......
xyz
必须排在排序列表的首位?
【参考方案1】:
你可以试试这个比较器:
Comparator<String> comparator = new Comparator<String>()
@Override
public int compare(String arg1, String arg2)
if (arg1.matches("^.*_locked$") && arg2.matches("^.*_locked$"))
// Both string have _locked at the end. Retain the order.
return 0;
else if (arg1.matches("^.*_locked$"))
// First string have _locked. Swap.
return 1;
else if (arg2.matches("^.*_locked$"))
// Second string have _locked. No need to swap
return -1;
// None of the string have _locked. Retain the order
return 0;
;
Collections.sort(list, comparator);
【讨论】:
真棒谢谢。正是我想要的。我试过的第一个,所以我接受了。谢谢@所有【参考方案2】:使用比较器:
Collections.sort(list, new Comparator()
public int compare(String o1, String o2)
if ((o1.endsWith("_locked")&&(!o2.endsWith("_locked")))
return 1;
else if (!(o1.endsWith("_locked")&&(o2.endsWith("_locked")))
return 1;
else
//Fallback sorting based on start of string left as exercise to reader
);
【讨论】:
【参考方案3】:您可以尝试使用匿名参数化比较器,例如:
ArrayList<String> myList = new ArrayList<String>();
myList.add("xyz");
myList.add("bcd");
myList.add("abc_locked");
myList.add("cde");
myList.add("efg_locked");
myList.add("fgh");
Collections.sort(myList, new Comparator<String>()
@Override
public int compare(String arg0, String arg1)
if (!arg0.contains("_locked") && !arg1.contains("_locked"))
return arg0.compareTo(arg1);
else if (arg0.contains("_locked") && arg1.contains("_locked"))
return arg0.compareTo(arg1);
else if (arg0.contains("_locked"))
return 1;
else
return -1;
;
);
System.out.println(myList);
输出:
[bcd, cde, fgh, xyz, abc_locked, efg_locked]
【讨论】:
【参考方案4】:Comparator<String> comparator = new Comparator<String>()
@Override
public int compare(String arg1, String arg2)
if (arg1.endsWith("_locked") && arg2.endsWith("_locked"))
return 0;
else if (arg1.endsWith("_locked"))
return 1;
else if (arg2.endsWith("_locked"))
return -1;
return 0;
;
【讨论】:
【参考方案5】:你可以试试这个
Collections.sort(list, new Comparator()
@Override
public int compare(String s1, String s2)
// ascending order
return id1.compareTo(id2);
// descending order
//return id2.compareTo(id1);
);
对于对象的集合
/*
Here myItems is an arraylist MyItem added randomly
MyItem got a property int id
This method provide me myItems in ascending order of id's
*/
Collections.sort(myItems, new Comparator<MyItem>()
@Override
public int compare(MyItem lhs, MyItem rhs)
// TODO Auto-generated method stub
int lhsId = lhs.getId();
int rhsId = rhs.getId();
return lhsId>rhsId ? 1 : -1;
);
当然你也可以参考this
【讨论】:
因为 OP 处理的是String
而不是MyItem
。这个答案基本上与问题无关。以上是关于Java,特殊排序一个 ArrayList,最后有更长的条目的主要内容,如果未能解决你的问题,请参考以下文章
根据字符串数组顺序对 ArrayList 重新排序 - Java