我有一个arraylist和一个String数组。 String数组包含ID,Array List包含与这些ID相关的ID和信息。此ArrayList处于不合需要的顺序。我有一个字符串的字符串数组,我希望它们在ArrayList中。
半伪码示例:
ArrayList<MyObject> myList = new ArrayList<MyObject>();
for (every username)
{
myList.add(new MyObject(id, username, content, country);
}
String[] ids = new String[myList.size()];
...Ids are added and sorted here...
我现在有一个ID列表,按正确的顺序排列。 &#34; myList&#34;中的每个ID对应于&#34; ID&#34;中的ID字符串数组。我想排序&#34; myList&#34;基于它在&#34; ids&#34;中的相应id的顺序。字符串数组。
如何以这种方式重新排序我的ArrayList?
Eg. if in Array list I have:
1. 123, Bob, test, USA
2. 1234, Vladimir, test, USA
3. 12345, Yoseph, test, USA
and in the String[] I have:
1. 1234
2. 123
3.12345
如何根据字符串数组中的Ids重新排序ArrayList,从而产生:
1. 1234, Vladimir, test, USA
2. 123, Bob, test, USA
3. 12345, Yoseph, test, USA
答案 0 :(得分:6)
一种解决方案是迭代ids
数组,并在对象中搜索数组中的当前id
。我们知道它的最终(所需)位置:它是数组中的索引(因为我们希望列表就像数组一样排序),所以我们可以将这个元素移动到列表中的最后位置(我们通过交换它来实现这一点)元素位于我们当前在数组中的位置。
for (int i = ids.length - 1; i > 0; i--) { // Downward for efficiency
final String id = ids[i];
// Big optimization: we don't have to search the full list as the part
// before i is already sorted and object for id can only be on the remaining
for (int j = i; j >= 0; j--) // NOTE: loop starting at i
if (id.equals(myList.get(j).getId()) {
Collections.swap(myList, j, i);
break;
}
}
注意:for
循环省略了最后一个元素(i==0
),因为如果所有其他元素都已到位,则最后一个元素也位于(其)位置。
这比创建比较器和使用排序算法(例如Collections.sort()
更快)要快得多,因为元素的顺序已知(由ids
数组定义)和排序算法(无论算法有多聪明)都只能使用比较器返回的信息[less | equals | greater]
。
答案 1 :(得分:4)
您可以根据数组中的索引编写自己的Comparator
:
public class MyObjectComparator implements Comparator<MyObject> {
private List<String> ids;
public MyObjectComparator(String[] ids) {
this.ids = Arrays.asList(ids); // Copying the array would be safer
}
public int compare (MyObject obj1, MyObject obj2) {
return Integer.compare(ids.indexOf(obj1), ids.indexOf(obj2));
}
}
// Use it:
Collections.sort (myList, new MyObjectComparator(ids));
答案 2 :(得分:1)
你只需要一个比较器:
List<String> ids = Arrays.asList(array);
Collections.sort(list, new Comparator<MyObject>() {
@Override
public int compare(MyObject o1, MyObject o2) {
return Integer.compare(ids.indexOf(o1.getId()), ids.indexOf(o2.getId()));
}
});
当然,如果你的名单很大,这将是非常低效的。因此,您最好构建一个Map<String, Integer>
,其中包含每个ID作为键及其在数组中的位置作为值,并在比较器中使用此映射:
Map<String, Integer> idPositions = new HashMap<>();
for (int i = 0; i < array.length; i++) {
idPositions.put(array[i], i);
}
Collections.sort(list, new Comparator<MyObject>() {
@Override
public int compare(MyObject o1, MyObject o2) {
return idPositions.get(o1.getId()).compareTo(idPositions.get(o2.getId()));
}
});
答案 3 :(得分:0)
crs_rawStepSeqNum
:你的arrayList
crs_rawStepSeqNum
:相同的arrayList
for(int x =0;x<crs_rawStepSeqNum.size();x++)
if((x+1) < crs_rawStepSeqNum.size()) {
if (Integer.parseInt(crs_rawStepSeqNum.get(x)) > Integer.parseInt(crs_rawStepSeqNum.get(x + 1))) {
crs_rawStepSeqNum.set(x, crs_rawStepSeqNum.get(x + 1));
crs_rawStepSeqNum.set(x + 1, crs_StepSeqNum.get(x));
crs_StepSeqNum.clear();
crs_StepSeqNum.addAll(crs_rawStepSeqNum);
x=0;
}
}
}