Поэтому я недавно получил следующий вопрос в техническом интервью, и я подумал, что это довольно интересно.
Для двух массивов: A = {1,2,2,4,5} и B = {1,2,6,} писать код, который выполняет следующие две операции: AB {2,4,5} и BA {6}, Значит, вы найдете общий элемент в другом массиве и удалите его из оригинала. Кроме того, если B было {1,2}, тогда BA было бы просто {}, так как A содержит все элементы B и B не имеет уникальных элементов.
Я решил этот вопрос следующим образом, и я надеялся узнать, есть ли у кого-нибудь какие-либо предложения о том, как сделать его лучше.
public static void main(String args[]) {
Map hashtable = new HashMap();
int a[] = {1,1,2,4,5,6,6};
int b[] = {1,2,6};
ArrayList ba = new ArrayList();
ArrayList ab = new ArrayList();
int[] occurances = new int[a.length];
//int occurances = 0;
for (int i = 0; i < a.length; i++) {
occurances[a[i]]++;
hashtable.put(a[i], occurances[a[i]]);
}
//System.out.println(Arrays.toString(occurances));
System.out.println(hashtable);
//find BA
for (int i = 0; i < b.length; i++) {
if(hashtable.containsKey(b[i])) {
occurances[b[i]]--;
hashtable.put(b[i], occurances[b[i]]);
} else ba.add(b[i]);
}
for(int i = 0; i <a.length; i++) {
if(hashtable.containsKey(a[i]) && occurances[a[i]] != 0) {
ab.add(a[i]);
occurances[a[i]]--;
hashtable.put(a[i], occurances[a[i]]);
}
}
System.out.println("AB = " + ab);
System.out.println("BA =" + ba);
}
}
**** ИЗМЕНИТЬ ***** Я ошибочно назвал массивы наборами, когда я изначально задал вопрос. Поскольку массивы могут иметь повторяющиеся элементы, они по определению не являются Sets. Извините за путаницу.
Вы можете использовать Set
которые имеют функции объединения и пересечения.
Integer a[] = {1, 2, 2, 4, 5};
Integer b[] = {1, 2, 6};
public void test() {
// Grow the two sets from the arrays.
Set<Integer> sa = Arrays.stream(a)
.collect(Collectors.toCollection(TreeSet::new));
Set<Integer> sb = Arrays.stream(b)
.collect(Collectors.toCollection(TreeSet::new));
// Make a new one so I don't damage sa or sb.
Set<Integer> sc = new HashSet<>(sa);
sc.removeAll(sb);
System.out.println(sa + " - " + sb + " = " + sc);
Set<Integer> sd = new HashSet<>(sb);
sd.removeAll(sa);
System.out.println(sb + " - " + sa + " = " + sd);
}
печать
[1, 2, 4, 5] - [1, 2, 6] = [4, 5]
[1, 2, 6] - [1, 2, 4, 5] = [6]
Это можно сделать только с помощью стандартных операций Set
Set<Integer> a; //assume initialized with {1,2,4,5}
Set<Integer> b; //assume initialized with {1,2,6}
a.removeAll(b);
System.out.println(a);
Должен дать:
[4, 5]
Если вы это сделаете:
b.removeAll(a);
System.out.println(b);
Тогда вы получите
[6]
Map hashtable
хэш-таблицы .... мои глаза x_X{1,2,2,4,5}
не является набором.