Losowanie stringów z tablicy

0

Hej, dopiero zaczynam grzebać w javie, więc pewnie pytanie będzie się Wam wydawać proste, za co z góry przepraszam.:p

Mam dwie tablice ze Stringami (o różnej ilość Stringów).
Skorzystałem z ,,java.util.*;" do losowania stringa z jednej z tych tablic.
Chciałbym jednak, żeby nie losowało mi tych stringów, które powtarzają się w drugiej tablicy.

Kombinatoryka mi nie wyszła, usiłowałem ugryźć z różnych stron, ale po prostu jestem jeszcze kołkiem w tych sprawach, stąd proszę o pomoc:
jak to zrobić? :)

1

Losuj w pętli aż do skutku, sprawdzając czy string nie jest w drugiej tablicy... Albo zrób z drugiej tablicy zbiór, wtedy sprawdzanie będzie O(1).

1
TotalNewbie napisał(a):

Chciałbym jednak, żeby nie losowało mi tych stringów, które powtarzają się w drugiej tablicy.
jak to zrobić? :)

Podpowiedź:

Arrays.asList(secondArray).contains(firstArray[randomIndex])
1

Rozumiem, że:

  1. Masz dwie tablice - array1, array2.
  2. Chcesz z array1 wylosować elementy, które nie występują w array2.

Teraz masz dwie opcje:

  1. Jeśli takich losowań jest mało to można spokojnie po prostu powtarzać raz po raz losowanie:
    public static void main(final String[] args) {
        String[] array1 = {"A", "B", "C", "D"};
        String[] array2 = {"A", "C", "E"};

        System.out.println(findElement(array1, array2));
    }

    static String findElement(final String[] array, final String[] values) {
        String result = null;
        do {
            result = array[ThreadLocalRandom.current().nextInt(array.length)];
        } while (isInArray(result, values));

        return result;
    }

    static boolean isInArray(final String element, final String[] array) {
        return Arrays.binarySearch(array, element, String::compareTo) >= 0;
    }
  1. Jeśli takich losowań będzie dużo to lepiej sobie przygotować nową tablicę, która będzie zawierała elementy z tablicy array1, ale nie elementy z array2 :
    public static void main(final String[] args) {
        String[] array1 = {"A", "B", "C", "D"};
        String[] array2 = {"A", "C", "E"};

        String[] filtered = filterValues(array1, array2);

        System.out.println(filtered[ThreadLocalRandom.current().nextInt(filtered.length)]);
    }

    static String[] filterValues(final String[] array, final String[] values) {
        Set<String> valuesSet = Stream.of(values).collect(Collectors.toSet());

        return Stream.of(array)
                .filter(element -> !valuesSet.contains(element))
                .toArray(String[]::new);
    }
1
  1. Kopiujesz pierwszą tablicę
  2. Robisz Collections.shuffle na kopii
  3. Wyciągasz po kolei wszystkie elementy z kopii (może być po kolei, to nic nie zmienia)

shuffle pomiesza Ci te stringi miejscami w array i wtedy problem szukania wyciągania stringa, który już został wyciągnięty eliminujesz

0

Dzięki za pomoc :).

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