Tablice int dodawane do set

0

Potrzebuję zrobić coś takiego mam TreeSet które sobie coś tam robi.
```
Set<int[]> set = new TreeSet<int[]>(new ArrayComparator());


i teraz do set chcę dodawać:
                    ```
set.add(new int[] {arr[0],arr[1] .... });

Chodzi oto że to array musi być za każdym razem innej długości.

Ogólnie mam coś takiego. Tylko chodzi o to żeby to dodawać dynamicznie a nie arr1 arr2 arr3. I z tym mam problem. Dlatego, że te tablice są generowane przez inny kod i są różnej długości.

public class Main {

    public static void main(String[] args) {
        int[] arr1 = {0,1};
        int[] arr2 = {0,1};
        int[] arr3 = {1,1};

        Set<int[]> mySet = new TreeSet<int[]>(new ArrayComparator());
        mySet.add(arr1);
        mySet.add(arr2);
        mySet.add(arr3);
        mySet.add(new int[] {0,0});
        System.out.println(mySet.size());
        for(int[] aa: mySet){
            System.out.println(aa[0]+" , "+aa[1]);
        }
    }
}


class ArrayComparator implements Comparator {

    @Override
    public int compare(Object o1, Object o2) {
        int[] ar1 = (int[]) o1;
        int[] ar2 = (int[]) o2;
        if (ar1.length != ar2.length) {
            return -1;
        }
        for (int count = 0; count < ar1.length; count++) {
            if (!(ar1[count] == ar2[count])) {
                return -1;
            }
        }
        return 0;
    }
}
1

Nie za bardzo wiadomo o co chodzi. Wiem, że chcesz dodawać int[] do Set'u. Wiem, że wiesz co to jest Set.add(). Nie wiem tylko, czego nie możesz zrobić.

Chodzi ci o to, żeby do Set'a nie wepchnąć tablicy, która ma istniejącą długość? Po prostu sprawdź przed dodaniem, czy taka tablica jest już w zbiorze


import java.util.Arrays;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Fun {

    public static void main(String[] args) {
        Set<int[]> set = prepareData();

        int[] firstTested = {1,2}; // shouldn't pass
        int[] secondTested = {1};

        addToSet(firstTested, set);
        addToSet(secondTested, set);

        String resultText = set.stream().map(Arrays::toString).collect(Collectors.joining(","));

        System.out.println(resultText);
    }

    private static boolean addToSet(int[] tested, Set<int[]> set) {
        if (isArrayLengthInSet(tested, set)) {
            return false;
        } else {
            return set.add(tested);
        }
    }

    private static boolean isArrayLengthInSet(int[] tested, Set<int[]> set) {
        return set.stream()
                .anyMatch(array -> array.length == tested.length);
    }

    private static Set<int[]> prepareData() {
        int[] first = {1,2,3,4};
        int[] second = {2,3};
        int[] third = {3,4,5};

        return Stream.of(first, second, third)
                .collect(Collectors.toSet());
    }
}

0

Chodzi o to, że ilość tablic się zmienia.
Czyli raz mamy trzy tablice
```
int[] arr1 = {0,1};
int[] arr2 = {0,1};
int[] arr3 = {1,1};

    Set<int[]> mySet = new TreeSet<int[]>(new ArrayComparator());

innym razem mamy 4 array czyli arr1,arr2,arr3,arr4. Jakiś tam kod generuje mi wynik i muszę go za każdym razem przypisać do tych tablic i potem przepuścić przez Comparator żeby sparawdzić czy już nie było takiego wyniku.
Nie wiem jak to rozwiązać ze generowany kod te wartości {0,1} itp. jest przypisywany do tablicy o innej nazwie. Jak do tego podejść.?
1
maf2 napisał(a):

Chodzi o to, że ilość tablic się zmienia.
Czyli raz mamy trzy tablice

Nie wiem jak to rozwiązać ze generowany kod te wartości {0,1} itp. jest przypisywany do tablicy o innej nazwie. Jak do tego podejść.?

Sprawdzić, czy istnieje taka tablica. Masz metodę Arrays.equals(int[], int[]), która sprawdza, czy tablice są równe co do długości i wartości pod indeksami.

0

Czemu zwyczajnie nie użyjesz ArrayList<int[]> tb; ?
tb[3] -> rozmiar 3
tb[10] -> rozmiar 10
Ewentualnie HashMap<int,int[]> tb;
i tak samo:
tb[3] -> rozmiar 3
tb[10] -> rozmiar 10

0

Może inaczej napiszę bo chyba się nie rozumiemy albo ja nie kojarzę.

Problem jest taki, że te tablice arr są generowane u mnie rekurencyjnie i za każdym razem wywołania rekurencji zapisywane są do tablicy arr. Chodzi mi o to, że ja muszę te wyniki z arr gdzieś zapisywać tak żeby mieć każdy z tych wyników np. w oddzielnej tablicy arr1, arr2, arr3 i móc to przekazać do tego Comparatora.

1 użytkowników online, w tym zalogowanych: 0, gości: 1