2010-07-08 17 views

risposta

1

Non dovresti "controllare" nulla per farlo, dovresti farlo in modo che i duplicati non vengano mai aggiunti in primo luogo. Per fare questo:

  1. inizio con una List<String> delle opzioni
    • copiare l'elenco
    • aggiungere un elemento casuale al risultato
    • rimuovere tale elemento.
    • Torna 3 fino a quando hai aggiunto il maggior numero di elementi che si desidera o là non sono più lasciati
+0

Anche se non ha importanza per le liste più piccole, forse vale la pena notare che credo che questo richiede tempo quadratica (o meglio, se la lista ha n elementi e sei rimuovendo m elementi, ci vuole O (nm) tempo). Se si utilizza un 'ArrayList', la rimozione di un elemento richiede tempo O (n), quindi la rimozione di m elementi richiede tempo O (nm). Per un 'LinkedList', raggiungere un elemento casuale nella lista richiede O (n) tempo, quindi raggiungere m elementi richiede tempo O (nm). –

2

Una diversa opzione è quella di creare un List<String> di tutte le opzioni, e l'uso Collections.shuffle per permutare in modo casuale la lista. È quindi possibile unire i primi n elementi.

Poiché sia ​​Collections.shuffle che unendo i primi n elementi richiede un tempo lineare, l'intero processo dovrebbe richiedere un tempo lineare.

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); 
    }  
} 

uscita:

Some fruits: apple, pear, orange, peach 

ma sono d'accordo con Michael Borgwardt su che è una brutta cosa da controllare con indice di più e più volte.

2

Ovviamente è possibile controllare la stringa eseguendola tramite iterating (ad esempio use indexOf()), ma vorrei usare un Set in questa particolare istanza per aggiungere i frutti (se già esiste non verrà aggiunto di nuovo), una volta terminato l'aggiunta di frutta converti il ​​Set in una stringa, ad es

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

Il controllo condizionale se 'frutta' contiene' frutto' non è necessario - aggiungere un frutto che è già nel set lascia il set invariato. –

0

Un modo semplice per farlo è simile alla soluzione Marc van Kempen s', ma più piccola.

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

Il StringBuilder classe non ha un metodo , ma String fa. Quindi è possibile utilizzare StringBuilder per creare una stringa utilizzando toString(). Quindi chiama su di esso, per verificare se contiene quel carattere o stringa.

Esempio:

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

usa meglio indexOf –

Problemi correlati