例如,我有两个数组:
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}]
答案 0 :(得分:1)
您的解决方案具有O(n^2)
时间复杂度 - 对于大型列表,这些嵌套循环将非常慢。
但是,借助HashMap
,O(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()));
仅当列表在不同的订单中具有相同的水果且没有水果出现两次时才有效。