基于字符串数组的顺序重新排序ArrayList - Java

时间:2014-08-26 05:44:42

标签: java arraylist multidimensional-array arrays

我有一个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

4 个答案:

答案 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;
        }
    }
}