Я попробовал несколько подходов - используя Map
и Set
, чтобы получить различные элементы.Согласно требованию эти не используют LinkedHashSet
или LinkedHashMap
.Кроме того, порядок сохраняется.
Я использовал этот пример входного массива в обоих случаях и получил ожидаемый результат.
ВХОД: int [] arr = new int [] {1, 99, 2, 82, 99, -20, 9, 2, 9, 45, -319, 1};
РЕЗУЛЬТАТ: [1, 99, 2, 82, -20, 9, 45, -319]
Примеры кода:
Использование карты :
int [] arrayWithDistictElements = new int [arr.length];
int noOfDistinctElements = 0;
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0, j = 0; i < arr.length; i++) {
if (map.put(arr [i], 1) == null) {
arrayWithDistictElements [j++] = arr [i];
++noOfDistinctElements;
}
}
int [] result = Arrays.copyOf(arrayWithDistictElements, noOfDistinctElements);
Использование набора :
Set<Integer> set = new HashSet<>();
int [] arrayWithDistictElements = new int [arr.length];
int noOfDistinctElements = 0;
for (int i = 0, j = 0; i < arr.length; i++) {
if (set.add(arr [i])) {
arrayWithDistictElements [j++] = arr [i];
++noOfDistinctElements;
}
}
int [] result = Arrays.copyOf(arrayWithDistictElements, noOfDistinctElements);
Код :
Вот полный код моих тестов Iпробовал и некоторые результаты:
import java.util.*;
import java.util.stream.*;
import java.time.*;
import java.text.*;
public class UniqueArrayTester {
private final static int ARRAY_SIZE = 10_000_000;
private static Random r = new Random();
public static void main(String [] args) {
DecimalFormat formatter = new DecimalFormat("###,###,###,###");
System.out.println("Input array size: " + formatter.format(ARRAY_SIZE));
for (int i = 0; i < 5; i++) {
// For testing with a small input and print the result use this as input:
//int [] arr = new int [] {1, 99, 2, 82, 99, -20, 9, 2, 9, 45, -319, 1};
//System.out.println(Arrays.toString(arr));
System.out.println("[Test " + Integer.toString(i+1) + "]");
int [] arr = getArray();
process1(arr);
process2(arr);
process3(arr);
}
}
private static int [] getArray() {
return IntStream.generate(() -> r.nextInt())
.limit(ARRAY_SIZE)
.toArray();
}
/*
* Process uses Stream API.
*/
private static void process1(int [] arr) {
LocalTime time1 = LocalTime.now();
int [] result = IntStream.of(arr).distinct().toArray();
LocalTime time2 = LocalTime.now();
System.out.println("Process 1 (using streams) out array size: " + result.length);
System.out.println(" Duration in millis: " + Duration.between(time1, time2).toMillis());
//System.out.println(Arrays.toString(result));
}
/*
* Process uses a Map to arrive at distinct elements.
*/
private static void process2(int [] arr) {
LocalTime time1 = LocalTime.now();
int [] arrayWithDistictElements = new int [arr.length];
int noOfDistinctElements = 0;
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0, j = 0; i < arr.length; i++) {
if (map.put(arr [i], 1) == null) {
arrayWithDistictElements [j++] = arr [i];
++noOfDistinctElements;
}
}
int [] result = Arrays.copyOf(arrayWithDistictElements, noOfDistinctElements);
LocalTime time2 = LocalTime.now();
System.out.println("Process 2 (using map) out array size: " + result.length);
System.out.println(" Duration in millis: " + Duration.between(time1, time2).toMillis());
//System.out.println(Arrays.toString(result));
}
/*
* Process uses a Set to arrive at distinct elements.
*/
private static void process3(int [] arr) {
LocalTime time1 = LocalTime.now();
Set<Integer> set = new HashSet<>();
int [] arrayWithDistictElements = new int [arr.length];
int noOfDistinctElements = 0;
for (int i = 0, j = 0; i < arr.length; i++) {
if (set.add(arr [i])) {
arrayWithDistictElements [j++] = arr [i];
++noOfDistinctElements;
}
}
int [] result = Arrays.copyOf(arrayWithDistictElements, noOfDistinctElements);
LocalTime time2 = LocalTime.now();
System.out.println("Process 3 (using set) out array size: " + result.length);
System.out.println(" Duration in millis: " + Duration.between(time1, time2).toMillis());
//System.out.println(Arrays.toString(result));
}
}
Результаты теста :
Используемое оборудование: процессор Intel CORE i3, Windows 7 64 бит, Java 8
Input array size: 10,000,000
[Test 1]
Process 1 (using streams) out array size: 9988498
Duration in millis: 10649
Process 2 (using map) out array size: 9988498
Duration in millis: 10294
Process 3 (using set) out array size: 9988498
Duration in millis: 8982
[Test 2]
Process 1 (using streams) out array size: 9988331
Duration in millis: 7839
Process 2 (using map) out array size: 9988331
Duration in millis: 5567
Process 3 (using set) out array size: 9988331
Duration in millis: 4155
[Test 3]
Process 1 (using streams) out array size: 9988286
Duration in millis: 9138
Process 2 (using map) out array size: 9988286
Duration in millis: 6799
Process 3 (using set) out array size: 9988286
Duration in millis: 7155
[Test 4]
Process 1 (using streams) out array size: 9988431
Duration in millis: 7908
Process 2 (using map) out array size: 9988431
Duration in millis: 6909
Process 3 (using set) out array size: 9988431
Duration in millis: 7205
[Test 5]
Process 1 (using streams) out array size: 9988334
Duration in millis: 7971
Process 2 (using map) out array size: 9988334
Duration in millis: 6910
Process 3 (using set) out array size: 9988334
Duration in millis: 7196