基于已排序的ArrayList对ArrayList进行排序的最佳方法是什么?

时间:2017-10-23 20:30:54

标签: java sorting arraylist

例如,我有两个数组:

arrayA[{name: "apple", value: 1}, {name: "banana", value: 2} , {name: "pear", value: 3}] arrayB[{name: "banana", value: 4}, {name: "apple", value: 5} , {name: "pear", value: 3}]

最终结果应该是arrayB,如下所示:

arrayB[{name: "apple", value: 5}, {name: "banana", value: 4} , {name: "pear", value: 3}]

我能想到的最佳解决方案是双循环播放,一个用于跟踪我在arrayA中的位置,另一个用于跟踪我在arrayB中的位置:

for (int i = 0; i < arrayB.size(); i++) {
    if (!arrayB.get(i).getName().equals(arrayA.get(i).getName()) {
        Object temp = arrayB.get(i);

        for (int j = i + 1; j < arrayB.size(); j++) {
            if (arrayB.get(j).getName().equals(arrayA.get(i).getName())) {
                arrayB.set(i, arrayB.get(j));
                arrayB.set(j, temp);
            }
        }
    }
}

有更有效的方法吗?

另一个例子是如果我有这两个数组:

arrayA[{name: "pear", value: 1}, {name: "apple", value: 2} , {name: "banana", value: 3}] arrayB[{name: "banana", value: 4}, {name: "apple", value: 5} , {name: "pear", value: 3}]

然后arrayB应如下所示:(即保存以假设arrayA已经排序。) arrayB[{name: "pear", value: 3}, {name: "apple", value: 5} , {name: "banana", value: 4}]

1 个答案:

答案 0 :(得分:1)

您的解决方案具有O(n^2)时间复杂度 - 对于大型列表,这些嵌套循环将非常慢。

但是,借助HashMapO(n)解决方案是可行的。

Map<String, NameAndValue> map = new HashMap<>();
for (NameAndValue x : arrayB)
    map.put(x.getName(), x);

for (int i = 0; i < arrayA.size(); i++) 
    arrayB.set(i, map.get(arrayA.get(i).getName()));

仅当列表在不同的订单中具有相同的水果且没有水果出现两次时才有效。