Комплект - это естественный выбор, когда вы хотите уникальности. Чтобы избежать большого количества конверсий, вы можете перейти с int[]
на Integer[]
и получить очень короткий и чистый метод объединения.
Вот полный рабочий пример:
import java.util.*;
public class Union {
// Search Function
public boolean search(Integer a[], Integer i) {
for(int k = 0; k < a.length; k++) {
if(a[k] == i) {
return true;
}
}
return false;
}
// Union
public void union(Integer[] a, Integer[] b) {
Set<Integer> set = new HashSet<Integer>(Arrays.asList(a));
set.addAll(Arrays.asList(b));
Integer[] unionArray = set.toArray(new Integer[set.size()]);
System.out.println(Arrays.toString(unionArray));
}
public static void main(String...s) {
Integer[] array1 = new Integer[]{1,1,1,4,};
Integer[] array2 = new Integer[]{1,4,4,4,1,2};
new Union().union(array1, array2);
}
}
Очевидно, что здесь есть издержки для преобразования из массива в список, затем этот список для установки и затем обратно в массив. Однако, как правило, не стоит иметь замысловатый код, который делает что-то быстрее - только когда вы обнаружите, что у вас есть узкое место в производительности в этой части кода, было бы полезно перейти к прямому и более длинному (по коду) решению.
Использование Set также позволяет избежать распространенной ошибки, когда вы перебираете массив для поиска элемента, чтобы убедиться, что добавляемый вами элемент не является дубликатом. Обычно такие решения имеют O (n ^ 2) временную сложность (см. this ).
Это не будет проблемой, если ваши массивы состоят из 10 элементов, но если у вас есть два массива, скажем, по 1000 уникальных элементов в каждом, вы будете выполнять много ненужных прогулок, делая ваш код очень медленным. В этом случае в решении на основе массива с проверкой дубликатов путем обхода массива вам потребуется выполнить 1000 * 1000/2 = 500 КБ операций, в то время как на основе набора будет около 5 КБ:
- 1000 для преобразования первого массива в список,
- 1000 для преобразования списка в набор,
- 1000 для преобразования второго массива в список,
- 1000 для добавления второго массива в набор и
- 1000, чтобы преобразовать его обратно из набора в массив)
в качестве решения на основе множеств - O (n). Если вы предполагаете, что эти операции примерно одинаковы (не правда, но, тем не менее, это не плохое приближение), это в 100 раз быстрее.
Более того, это увеличивается быстро с увеличением количества уникальных элементов - для 10K элементов в каждом из массивов решение для обхода на основе массива может принять порядка 50 000 000 операций, а решение на основе набора - на 15 000. .
Надеюсь, это поможет.