2017-03-13 3 views
3

Ich habe eine ArrayList von String s und enthält Datensätze wie:Wie kann ich doppelte Wörter aus String in Java entfernen?

this is a first sentence 
hello my name is Chris 
what's up man what's up man 
today is tuesday 

Ich brauche diese Liste zu löschen, so dass der Ausgang nicht wiederholt Inhalt enthalten. Im obigen Fall sollte der Ausgang sein:

this is a first sentence 
hello my name is Chris 
what's up man 
today is tuesday 

wie Sie geändert sehen, hat der dritte String worden und enthält jetzt nur eine Anweisung what's up man statt zwei von ihnen. In meiner Liste gibt es eine Situation, dass manchmal der String korrekt ist, und manchmal ist es wie oben gezeigt verdoppelt.

ich es los zu bekommen, so dachte ich über diese Liste durchlaufen:

for (String s: myList) { 

aber ich kann Duplikate zu beseitigen, vor allem nicht einen Weg finden, da die Länge der einzelnen Strings nicht bestimmt wird, und damit meine ich es Rekord sein könnte:

this is a very long sentence this is a very long sentence 

oder manchmal kurzen:

single word singe word 

Gibt es dafür vielleicht eine Java-Funktion?

+2

Sie jede Zeile in ein Array von Strings aufgeteilt kann mit 'line.split (“ „)', dann sie hinzufügen zu einem 'LinkedHashSet' und lies sie dann wieder aus. – 4castle

+0

Keine Funktion, aber Sie können diese Logik implementieren: teilen Sie jedes Wort durch Token und fügen Sie es jetzt in Set ... zurück – minigeek

+0

@ 4castle haha ​​.. Concurrent Kommentare – minigeek

Antwort

1

Annahmen:

  1. groß geschriebene Worte sind auf Kleinbuchstaben gleich.

String fullString = "lol lol"; 
String[] words = fullString.split("\\W+"); 
StringBuilder stringBuilder = new StringBuilder(); 
Set<String> wordsHashSet = new HashSet<>(); 

for (String word : words) { 
    // Check for duplicates 
    if (wordsHashSet.contains(word.toLowerCase())) continue; 

    wordsHashSet.add(word.toLowerCase()); 
    stringBuilder.append(word).append(" "); 
} 
String nonDuplicateString = stringBuilder.toString().trim(); 
+0

Sie brauchen ein größeres Argument, vorausgesetzt, dass die Wörter gleich sind, wenn nicht. – HopefullyHelpful

+0

Zusätzliche Annahme hinzugefügt. –

0

Es hängt von der Situation, die Sie haben aber davon aus, dass die Zeichenfolge höchstens zweimal wiederholt werden kann und nicht drei oder mehr Mal die Länge des gesamten Strings finden konnten, finden die Halb Zeige und vergleiche jeden Index nach dem halben Punkt mit dem passenden Anfangsindex. Wenn die Zeichenfolge mehr als einmal wiederholt werden kann, benötigen Sie einen komplizierteren Algorithmus, der zuerst bestimmt, wie oft die Zeichenfolge wiederholt wird, und dann den Startindex jeder Wiederholung findet und alle Indizes ab dem Beginn der ersten Wiederholung abschneidet. Wenn Sie etwas mehr Kontext für mögliche Szenarien bereitstellen können, die Sie erwarten, können wir damit beginnen, einige Ideen zusammenzustellen.

2

den String Angenommen wird nur zweimal wiederholt und mit einem Raum dazwischen wie in Ihrem Beispiel würde die folgende Code Wiederholungen entfernen:

for (int i=0; i<myList.size(); i++) { 
    String s = myList.get(i); 
    String fs = s.substring(0, s.length()/2); 
    String ls = s.substring(s.length()/2+1, s.length()); 
    if (fs.equals(ls)) { 
     myList.set(i, fs); 
    } 
} 

Der Code nur jeden Eintrag der Liste in zwei Teil gespalten (dividiert durch den halben Punkt). Wenn beide gleich sind, ersetzen Sie das ursprüngliche Element durch nur eine Hälfte und entfernen Sie so die Wiederholung.

Ich habe den Code getestet und konnte @ Brendan Robert nicht sehen. Dieser Code folgt der gleichen Logik wie seine Antwort.

1

einfache Logik: split jedes Wort durch Token Space i.e "", und fügen Sie es nun in LinkedHashSet, abrufen zurück, Ersetzen "[", "]", ""

String s = "I want to walk my dog I want to walk my dog"; 
Set<String> temp = new LinkedHashSet<>(); 
String[] arr = s.split(" "); 

for (String ss : arr) 
     temp.add(ss); 

String newl = temp.toString() 
      .replace("[","") 
      .replace("]","") 
      .replace(",",""); 

System.out.println(newl); 

o/p: ich meinen Hund

2

Ich würde vorschlagen, gehen wollen mit Reguläre Ausdrücke. Ich konnte um Duplikate entfernen, dieses Muster verwenden: \b([\w\s']+) \1\b

public class Main { 
    static String [] phrases = { 
      "this is a first sentence", 
      "hello my name is Chris", 
      "what's up man what's up man", 
      "today is tuesday", 
      "this is a very long sentence this is a very long sentence", 
      "single word single word", 
      "hey hey" 
    }; 
    public static void main(String[] args) throws Exception { 
     String duplicatePattern = "\\b([\\w\\s']+) \\1\\b"; 
     Pattern p = Pattern.compile(duplicatePattern); 
     for (String phrase : phrases) { 
      Matcher m = p.matcher(phrase); 
      if (m.matches()) { 
       System.out.println(m.group(1)); 
      } else { 
       System.out.println(phrase); 
      } 
     } 
    } 
} 

Ergebnisse:

this is a first sentence 
hello my name is Chris 
what's up man 
today is tuesday 
this is a very long sentence 
single word 
hey 
Verwandte Themen