2010-07-08 8 views

Odpowiedz

1

Nie powinieneś "sprawdzać" niczego, aby to zrobić, powinieneś zrobić to tak, aby duplikaty nigdy nie były dodawane w pierwszej kolejności. Aby to zrobić:

  1. początek z List<String> opcji
    • skopiować listę
    • dodać element losowy do wyniku
    • usunąć ten element.
    • Wróć do 3 aż dodasz tyle elementów, ile chcesz lub nie są już opuścił
+0

Mimo to nie ma znaczenia dla mniejszych list, być może warto zauważyć, że wierzę, że to trwa kwadratowego czasu (albo raczej, jeśli lista zawiera n elementów i jesteś usunięcie m elementów zajmuje czas O (nm). Jeśli użyjesz 'ArrayList', usunięcie elementu zajmuje czas O (n), więc usunięcie m elementów zajmuje czas O (nm). W przypadku 'LinkedList' dotarcie do losowego elementu na liście zajmuje czas O (n), więc osiągnięcie m elementów zajmuje czas O (nm). –

2

Innym rozwiązaniem jest stworzenie List<String> wszystkich opcji i korzystania Collections.shuffle losowo permutować listę. Możesz następnie połączyć pierwsze n elementów.

Ponieważ zarówno Collections.shuffle, jak i łączenie pierwszych n elementów zajmuje czas liniowy, cały proces powinien zająć liniowy czas.

0
import java.util.Random; 

public class Test { 
    public static void main(String args[]) { 
     String[] fruits = { "apple", "pear", "orange", "peach", "cherry" }; 

     StringBuilder sb = new StringBuilder("Some fruits: apple"); 

     Random r = new Random(); 
     int N = 3; 
     for (int i = 0; i < N; i++) { 
      String toAdd; 
      do { 
       toAdd = fruits[r.nextInt(fruits.length)]; 
      } while (sb.indexOf(toAdd) != -1); 

      sb.append(", " + toAdd); 
     } 

     System.out.println(sb); 
    }  
} 

wyjściowa:

Some fruits: apple, pear, orange, peach 

Ale zgadzam się z Michaelem Borgwardt na to, że to zła rzecz do sprawdzenia za pomocą indeksu od kółko.

2

Oczywiście można sprawdzić ciąg przez iterowanie przez niego (np. Użyj indexOf()), ale użyłbym zestawu w tym konkretnym przypadku, aby dodać owoce (jeśli już istnieje, to nie zostanie dodane ponownie), gdy skończysz dodawanie owoców, przekonwertuj Set na ciąg, np

Set<String> fruits = new HashSet<String>(); 
for (String fruit: fruitSource) { 
    fruits.add(fruit); 
} 
StringBuilder sb = new StringBuilder(); 
for (String fruit: fruits) { 
    sb.append(fruit); 
    sb.append(", "); 
} 
return sb.toString(); 
+0

Warunkowe sprawdzenie, czy 'owoce' zawiera' owoce' jest niepotrzebne - dodanie owocu, który jest już w zestawie, pozostawia zestaw niezmieniony. –

0

Prostym sposobem na to jest podobne do rozwiązania Marc van Kempen jest jednak mniejszy.

Set<String> fruits = new HashSet<String>(); 
StringBuilder sb = new StringBuilder(); 
for (String fruit: fruits) { 
    if(fruits.add(fruit)){ 
     sb.append(fruit); 
     sb.append(", "); 
    } 
} 
return sb.toString(); 
5

StringBuilder klasa nie ma metody , ale String robi. Możesz więc użyć StringBuilder, aby zbudować ciąg znaków za pomocą toString(). Następnie zadzwoń pod numer , aby sprawdzić, czy zawiera on ten znak lub ciąg znaków.

Przykład:

stringBuilder.toString().contains(characterYouWantToCheck) 
+0

lepiej użyć indexOf –

Powiązane problemy