如果两个arraylist具有相同的值,如何组合

时间:2011-09-23 09:39:16

标签: java arraylist duplicates

抱歉,如果我感到困惑,我有两个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]]

我正在尝试,但希望得到快速解决方案

提前致谢

3 个答案:

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