抱歉,如果我感到困惑,我有两个arraylist如下
al1 - [Consignment, Bank, Custodian, Rejected, Bank]
al2 - [[2, 0, 0, 0, 0, 0, 0],
[6, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0],
[4, 0, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0, 0]]
第一个元素al2用于第一个元素al1,依此类推
所以我的情况是我必须检查al1是否有任何重复值,如果已经结合了al2中的值
所以预期的结果是
al1 - [Consignment, Bank, Custodian, Rejected]
al2 - [[2, 0, 0, 0, 0, 0, 0],
[6, 1, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0],
[4, 0, 0, 0, 0, 0, 0]]
我正在尝试,但希望得到快速解决方案
提前致谢
答案 0 :(得分:0)
最后我找到了如下所示的解决方案:
for( int i=0; i < al1.size(); i++ ){
for( int j = al1.size()-1; j > i; j-- ){
if( al1.get(i).equals(al1.get(j)) ){
ArrayList temp1 = (ArrayList)al4.get(i);
ArrayList temp2 = (ArrayList)al4.get(j);
for(int k=0;k<temp1.size();k++){
if(!temp2.get(k).equals("0")){
temp1.set(k, temp2.get(k));
}
}
al1.remove(j);
al4.remove(j);
al4.set(i, temp1);
}
}
}
答案 1 :(得分:0)
我提供了一个基于Set性质的解决方案。希望能帮助到你。 new_alt1和new_alt2是你想要的答案。
HashSet dupTester = new HashSet();
ArrayList new_al1 = new ArrayList();
ArrayList new_al2 = new ArrayList();
for (int i=0; i<alt2.size();i++){
int lastSize = 0;
dupTester.add(alt2.get(i));
if (dupTester.size() > lastSize) {
new_alt1.add(alt1.get(i));
new_alt2.add(alt2.get(i));
}
lastSize = dupTester.size();
}
答案 2 :(得分:0)
请考虑这一点。这是更多的代码,但它更快更容易理解。还建议您返回地图而不是修改数组,因为您的初始问题是......
void combineDuplicates(ArrayList<String> a, ArrayList<ArrayList<Integer>> b) {
LinkedHashMap<String, ArrayList<Integer>> m = new LinkedHashMap<String, ArrayList<Integer>>();
for (int i = 0; i < a.size(); ++i) {
ArrayList<Integer> existing = m.get(a.get(i));
if (existing == null) { // not a repeat occurrence
m.put(a.get(i), b.get(i));
} else { // repeat occurrence; add newcomer to existing
plusEquals(existing, b.get(i));
}
}
// now we have the unique strings in order of occurrence associated
// with int array so its time to unpack onto the parameters
a.clear(); b.clear();
for (Map.Entry<String, ArrayList<Integer>> e : m.entrySet()) {
a.add(e.getKey()); b.add(e.getValue());
}
}
private void plusEquals(ArrayList<Integer> target, ArrayList<Integer> values) {
assert target.size() == values.size();
for (int i = 0; i < target.size(); ++i) {
target.set( target.get(i) + values.get(i) );
}
}