2017-07-27 11 views
1

Ich habe ein Problem mit einigen Aufgaben. Ich muss Wörter finden, die Buchstaben "r" enthalten und diese Wörter duplizieren. Ich habe versucht, dies mit for-Schleife zu tun:Java - wie man einen Buchstaben in einer Zeichenkette in ArrayList die doppelte Zeichenkette findet

for(int i = 0; i < list.size(); i++){ 
if(list.get(i).contains("r")){ 
      list.add(list.get(i)); 
} 

Aber es funktioniert überhaupt nicht. Wenn ich ein neues Element zum Array hinzufüge, würde es größer werden? Dann ändert sich list.size und loop wird es nicht schaffen, zum letzten Element des Arrays zu gelangen? Auch sollte duplizierten Wort nur nach dem Original, zum Beispiel Eingabe:

zeigen ram Katze

Ausgabe:

zeigen ram ram Katze

Wirklich habe ich keine Ahnung wie man es kopiert.

Dieses auch nicht funktioniert:

for(int i = 0; i < list.size(); i++){ 
if(list.get(i).contains("r")){ 
      list.add(i+1, list.get(i)); 
} 
+0

Warum Sie keine doppelte Arraylist erstellen? – Sandeep

+0

Nun, ich wusste nicht, ich könnte: D dachte, ich musste bestehende ändern. Vielen Dank. – YourDoom

Antwort

5

Duplikat für das Element Nach dem Hinzufügen der r Brief enthält, würden Sie schließlich zu diesem Duplikat bewegen und da es auch r enthält, werden Sie doppelte für sie hinzufügen, und dann nach dem Besuch dass eine andere Kopie du ein weiteres Duplikat hinzufügen wirst, und so weiter ... unendlich, so dass deine Schleife nicht enden wird (bis du Speicher ablegen wirst).

Um es zu vermeiden, nach duplizieren Element müssen Sie springen zum nächsten Element nach diesem Duplikat. Sie können durch zusätzliche Inkrementierung i tun nach

list.add(i+1, list.get(i)); 
i++; 

oder

list.add(++i, list.get(i)); 
+0

Jeez, es war so einfach: D Vielen Dank! – YourDoom

1

Sie können eine Kopie Ihrer ursprünglichen List und fügen Sie Elemente erstellen Sie es. Auf diese Weise ändert die Liste, über die Sie iterieren, nicht die Größe.

Zum Beispiel:

List<String> list = Arrays.asList("show", "ram", "cat"); 
List<String> result = new ArrayList<>(list); 
list.stream().filter(a -> a.contains("r")).forEach(a -> result.add(a)); 
0

Halten Sie es einfach und einfach eine andere List<String> verwenden.

public static void main(String[] args) { 
    List<String> input = Arrays.asList("show", "ram", "cat"); 

    List<String> result = new ArrayList<>(); 
    for (String s : input) { 
     if (s != null && s.contains("r")) { 
      result.add(s); 
     } 
     result.add(s); 
    } 

    System.out.println(result); 
} 

Wird gedruckt, die Sie möchten. Ich hoffe es hilft!

1

Je nach Art der Liste, kann dies leicht mit einem ListIterator erreicht werden, die eine add Methode, die genau ein Element hinzufügt, nachdem das aktuelle Element, sie aber nicht durchlaufen.

List<String> list = new ArrayList<>(Arrays.asList("show", "ram", "cat")); 

ListIterator<String> iterator = list.listIterator(); 
while (iterator.hasNext()) { 
    String value = iterator.next(); 
    if (value.contains("r")) { 
     iterator.add(value); 
    } 
} 

System.out.println(list); 

Die Ausgabe von dieser ist:

[show, ram, ram, cat]

Das mit ArrayList arbeiten und LinkedList, aber nicht mit den speziellen List, die direkt von Arrays.asList kommen, weil es als nicht änderbar ist.

0

Sie benötigen Wort zu finden, das r Brief enthält und danach alle gefundenen Wörter zu der Liste hinzufügen:

List<String> list = Arrays.asList("black", "red", "blue"); 
    List<String> result = list.stream() 
     .filter(i->i.contains("r")) 
     .collect(Collectors.toList()); 

    list.addAll(result); 
Verwandte Themen