Уникальные значения массива JAVA

public class unicNumbers {
public static int[] getUnique(int[] numbers) {
    ArrayList<Integer> unique = new ArrayList<Integer>();

for (int r :numbers){
   unique.add(numbers[r]);
}


for (int i = 1; i<unique.size();i++) {
       for (int r : unique) {
           if (unique.get(r)== unique.get(i)){
               unique.remove(i);
           }
       }
   }
        int uniqueValues[] = new int[unique.size()];
   for (int w:uniqueValues){
       uniqueValues[w] = unique.get(w);

   }
return uniqueValues;
    }
public static void main(String[] args) {
    int zalupa[]= {1,2,3};
    System.out.println(getUnique(zalupa));
}

}

Задача была такова: Из массива чисел вернуть уникальные. Решил сделать через ArrayList, но выдало ошибку Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3. Во-первых. Не понимаю почему. Во-вторых хотел бы увидеть другие варианты решения этой задачи (в преимуществе без ArrayList'a )


Ответы (2 шт):

Автор решения: Zeus
public static int[] getUnique(int[] numbers) {
        ArrayList<Integer> unique = new ArrayList<>();
for(int i:numbers){
    if(!unique.contains((i))){
        unique.add(i);
    }
    }
numbers = new int[unique.size()];
int c = 0;
for (int i:unique){
    numbers[c] = unique.get(c);
    c++;
}
return numbers;
}
    public static void main(String[] args) {
        int[] zalupa = {1,2,3,1,1,2,3,4,4,2};
        System.out.println(Arrays.toString(getUnique(zalupa)));
    }
}
→ Ссылка
Автор решения: kami

Так как уникальность надо обеспечить для простых int, можно воспользоваться StreamAPI, а точнее IntStream:

public static int[] getUnique(int[] numbers){
        return Arrays.stream(numbers)
                .distinct()
                .toArray();

    }
→ Ссылка