как объединить два массива, если имеет одинаковое значение - PullRequest
0 голосов
/ 23 сентября 2011

извините, если я запутался, у меня есть два архива, как показано ниже

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]]

1-й элемент al2 предназначен для 1-го элемента 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 голосов
/ 27 сентября 2011

Я предоставляю решение, основанное на природе Сета.Надеюсь, поможет.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(); 
    }
0 голосов
/ 27 сентября 2011

Рассмотрите это вместо этого. Это больше кода, но это быстрее и проще для понимания. Также рекомендуем вам возвращать карту вместо того, чтобы модифицировать массивы, поскольку ваши начальные проблемы указывают на состояние ...

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) );
  }
}
0 голосов
/ 27 сентября 2011

Наконец-то я нашел решение, показанное ниже:

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);
        }
    }    
} 
...