2016-01-13 13 views
6

Więc mam następującą tablicę:Jak wywołać Collections.Shuffle tylko na części tablicy Java

String [] randomList = new String [16]; 
    randomList[0]="Dog"; 
    randomList[1]="Dog"; 
    randomList[2]="Cat"; 
    randomList[3]="Cat"; 
    randomList[4]="Mouse"; 
    randomList[5]="Mouse"; 
    randomList[6]="Car"; 
    randomList[7]="Car"; 
    randomList[8]="Phone"; 
    randomList[9]="Phone"; 
    randomList[10]="Game"; 
    randomList[11]="Game"; 
    randomList[12]="Computer"; 
    randomList[13]="Computer"; 
    randomList[14]="Toy"; 
    randomList[15]="Toy"; 

chcę shuffle tylko pierwsze 9 elementów tej tablicy. Użyłem następującego kodu, ale przetasowałem całą tablicę.

Collections.shuffle(Arrays.asList(randomList)); 

W jaki sposób przetasować tylko część tablicy, a nie całą całość? Robię całkiem prosty program, więc chciałbym nadal używać klasy Kolekcje, jednak wszystkie rozwiązania są mile widziane. Dzięki

+0

http://stackoverflow.com/questions/7079809/how-can-i-shuffle-a-specific-range-of-an-arraylist –

+0

Powinieneś prawdopodobnie zainicjować twoją tablicę za pomocą 'String [] randomList = {" Pies, "Pies", "Kot", "Kot", "Mysz"/*...*/}; 'oraz. – XenoRo

Odpowiedz

10

Możesz użyć obiektu List type's subList method, aby uzyskać obiekt List z widokiem określonego zakresu elementów z oryginalnej listy. Nie testowałem tego, ale myślę, że powinno zadziałać:

Collections.shuffle(Arrays.asList(randomList).subList(startIndex, endIndex)); 
+1

słodko! I już miałem zasugerować, aby skopiować, przetasować i skopiować ... – alfasin

+0

Przetestowałem to, działa pięknie. – azurefrog

1

Możesz również wypróbować poniższe. Bardziej przejrzysty kod zostałby jednak zasugerowany przez templatetypedef. List<String> newList = new ArrayList<String>(); for(int i=0; i<randomList.size()-ValuePreferred; i++){ newList.add(randomList.get(i)); } Collections.shuffle(newList); randomList.removeAll(newList); newList.addAll(randomList);

Słyszałem również o problemie z wyciekiem pamięci z podlistą w tablicach. Nie jestem pewien, czy to się naprawiło. Jeśli ktoś może podać jakiekolwiek przydatne informacje dotyczące tego byłoby świetne. Pamiętaj, że specyficzne wywoływanie wartości pomiędzy listami spowoduje IndexOutOfBoundsIssue(). To powinno być załatwione.