2016-05-06 5 views
-1

Ich übergebe eine String name an eine Methode, wenn diese name nicht im Array ist dann wird es hinzugefügt.überprüfen, ob Array Werte enthält, wenn nicht, dann zu Arraylist hinzufügen - gleichzeitige Änderung Ausnahme - Java

habe ich versucht, diese erste bekam aber gleichzeitige Modifikation Ausnahme

List<String> people = new ArrayList<>(); 

public void addName(String name) { 
    if (people.isEmpty()) { 
     people.add(name); 
    } else { 
     for (String s : people) { 
      if (s.equals(name)) { 
       System.out.println("dont add"); 
      } else { 
       people.add(name); 
      } 
     } 
    } 
} 

Nach dem Einschalten Foren zu lesen Ich habe gelernt, Sie Iterator zu verwenden, dies zu vermeiden. Ich habe es versucht und behoben Concurrent Modification Exception, aber der Spieler wird hinzugefügt, obwohl ich sie nicht hinzugefügt, wenn sie im Array vorhanden sind, bekomme ich diese Ausgabe "Name existiert", wenn ich einen Namen bereits in der Liste bestehen, aber dann läuft es verstehen „Namen hinzugefügt“ auch so nicht, warum ist diese

if (people.isEmpty()) { 
    people.add(name); 
} else { 
    String name2 = null; 
    for (Iterator<String> it = people.iterator(); it.hasNext();) { 
     String element = it.next(); 
     if (element.equals(name)) { 
      String message = "name exists"; 
      System.out.println(message); 
      name2 = null; 
     } else if (!element.equals(name)) { 
      System.out.println("Name added"); 
      name2 = name; 
     } 
    } 
    if (name2 != null) { 
     people.add(name2); 
    } 
} 
+4

Äh, haben möchten, können Sie nicht verwenden 'people.contains (name);'? –

+0

das heißt, wenn ein Name "don" ist, dann hast du einen anderen Namen als "Esel" sie werden übereinstimmen, ich möchte nur nicht den Namen hinzufügen, wenn der gleiche Name im Array existiert – CookieMonster

+1

"Nach dem Lesen in Foren habe ich gelernt, Sie haben Iterator zu verwenden, um dies zu vermeiden. "Diese Foren waren falsch. Eine for-each-Schleife ist funktional identisch mit der Verwendung eines Iterators, und in beiden Fällen können Sie eine Sammlung nicht ändern, während Sie darüber iterieren. Gehen Sie mit dem Vorschlag von blahfunk und verwenden Sie die Methode 'contains'. Ihre gesamte addName-Methode kann mit nur zwei Codezeilen implementiert werden. (In Bezug auf Ihren Kommentar: Collection.contains steht in keinerlei Beziehung zu String.contains. Collection.contains verwendet Gleichheit, keinen Teilzeichentest.) – VGR

Antwort

3

Sie können es einfach durch:

public void addName(String name) { 
    if (!people.contains(name)) { 
     people.add(name); 
    } 
} 
0

passiert ich rechne damit Sie aus Ihrer Schleife brechen müssen, sobald Sie, dass der Name schon finden existiert. Andernfalls wird möglicherweise name2 auf null festgelegt und dann erneut auf einen Wert ungleich Null festgelegt.

Zum Beispiel:

  for (Iterator<String> it = people.iterator(); it.hasNext();) { 
       String element = it.next(); 
       if (element.equals(name)) { 
        String message = "name exists"; 
        System.out.println(message); 
        name2 = null; 
        break; 
       } else if(element.equals(name)==false) { 
        System.out.println("Name added"); 
        name2 = name; 
       } 
      } 

Aber tun Sie einen Blick auf contains haben, da dies ein sehr viel sauberer Ansatz ist!

1

Es klingt wie Sie einen Satz neu zu erfinden versuchen.

Set<String> names = new TreeSet<>(); // Or set of your choice 
names.add("Joe"); // Set contents ["Joe"] 
names.add("Bob"); // Set contents ["Joe", "Bob"]; 
names.add("Joe"); // Set contents ["Joe", "Bob"]; 

Wenn Sie die printlines

if (names.add(name) { 
    System.out.println("Added name " + name); 
} else { 
    System.out.println("Already added " + name); 
} 
Verwandte Themen