2017-02-22 6 views
-1

Ich versuche ein Programm zu entwickeln, das einen String sortieren und die Duplikate entfernen kann. Ich verwende dafür verschachtelte Schleifen. Wenn ich meinen Code ausführe, werden jedoch immer wieder ein paar Wörter wiederholt.Entfernen von Duplikaten mit verschachtelten Schleifen java

package q2; 

import java.util.Arrays; 

public class Q2 { 

public static void main(String[] args) { 
    String sentence = "ASK NOT WHAT YOUR COUNTRY CAN DO FOR YOU ASK WHAT YOU CAN DO FOR YOUR COUNTRY"; 
    String lowercaseSentence; 
    lowercaseSentence = sentence.toLowerCase(); 
    String[] sentenceWords = lowercaseSentence.split(" "); 
    int LenghtofSentence = sentenceWords.length; 
    String[] unique = new String[LenghtofSentence]; 

    for (int i = 0; i <= LenghtofSentence; i++) { 
     //System.out.println(i); 
     for (int j = 0; j <= LenghtofSentence; j++) { 
      if (!sentenceWords[i].equals(unique)) { 
       unique[j] = sentenceWords[i]; 
       j++; 
      } else { 
       j++; 
      } 
     } 
    System.out.println(Arrays.toString(unique)); 
    } 
} 
} 

Dies ist die Fehlermeldung Ich erhalte:

[ask, null, ask, null, ask, null, ask, null, ask, null, ask, null, ask, null, ask, null, ask] 
[not, null, not, null, not, null, not, null, not, null, not, null, not, null, not, null, not] 
[what, null, what, null, what, null, what, null, what, null, what, null, what, null, what, null, what] 
[your, null, your, null, your, null, your, null, your, null, your, null, your, null, your, null, your] 
[country, null, country, null, country, null, country, null, country, null, country, null, country, null, country, null, country] 
[can, null, can, null, can, null, can, null, can, null, can, null, can, null, can, null, can] 
[do, null, do, null, do, null, do, null, do, null, do, null, do, null, do, null, do] 
[for, null, for, null, for, null, for, null, for, null, for, null, for, null, for, null, for] 
[you, null, you, null, you, null, you, null, you, null, you, null, you, null, you, null, you] 
[ask, null, ask, null, ask, null, ask, null, ask, null, ask, null, ask, null, ask, null, ask] 
[what, null, what, null, what, null, what, null, what, null, what, null, what, null, what, null, what] 
[you, null, you, null, you, null, you, null, you, null, you, null, you, null, you, null, you] 
[can, null, can, null, can, null, can, null, can, null, can, null, can, null, can, null, can] 
[do, null, do, null, do, null, do, null, do, null, do, null, do, null, do, null, do] 
[for, null, for, null, for, null, for, null, for, null, for, null, for, null, for, null, for] 
[your, null, your, null, your, null, your, null, your, null, your, null, your, null, your, null, your] 
[country, null, country, null, country, null, country, null, country, null, country, null, country, null, country, null, country] 
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 17 

Ich Netbeans für diese Verwendung. Jede Hilfe wird geschätzt. Danke Keir

+1

Debuggen Sie Ihren Code. – f1sh

+1

Warum verwenden Sie nicht einfach ein 'Set' (z. B. ein' LinkedHashSet')? – Thomas

+5

Wenn Sie eine 'for' -Schleife wie folgt schreiben:' Für (int i = 0; i <= LenghtofSentence; i ++) 'gehen Sie über das Ende Ihres Arrays hinaus. Es sollte '<' anstelle von '<=' sein. – khelwood

Antwort

-1
package test; 


import java.util.ArrayList; 

import java.util.Arrays; 


public class Test { 


     public static void main(String[] args) { 

      String sentence = "ASK NOT WHAT YOUR COUNTRY CAN DO FOR YOU ASK WHAT YOU CAN DO FOR YOUR COUNTRY"; 

      String lowercaseSentence; 

      lowercaseSentence = sentence.toLowerCase(); 

      String[] sentenceWords = lowercaseSentence.split(" "); 

      int LenghtofSentence = sentenceWords.length; 

      String[] uniqueString = new String[LenghtofSentence]; 

      ArrayList<String> unique = new ArrayList<String>(); 

      int k=0; 
      for(int i=0;i<LenghtofSentence;i++) 
      { 
      if(!unique.contains(sentenceWords[i])) 
      { 
       unique.add(sentenceWords[i]); 
       k++; 
      } 
      } 
      for(int i=0;i<unique.size();i++) 
      { 
       uniqueString[i] = unique.get(i); 
       System.out.print(" "+uniqueString[i]); 
      } 
     } 
    } 
4

Ich weiß nicht, warum Sie For-Schleife dafür verwenden und es komplex machen.

Es kann einfach mit Set in Java getan werden. Set ist eine Sammlung, die keine doppelten Elemente enthält. Weitere link

Set<String> mySet = new LinkedHashSet<String>(Arrays.asList(sentenceWords)); 

Dadurch werden die Duplikate automatisch entfernen. Sie können Ihre Array ohne Duplikate von Set zurück wie folgt:

String[] unique = myset.toArray(new String[myset.size()]); 

auch folgende importieren, bevor über Code verwendet:

import java.util.Arrays; 
import java.util.LinkedHashSet; 
import java.util.Set; 

LinkedHashSet Mit den Auftrag halten, in denen die Wörter in dem Array vorhanden waren . Ich hoffe es hilft.

+1

Verwenden Sie ein 'LinkedHashSet', um die Wortreihenfolge beizubehalten. –

+0

Ja, wird den Code aktualisieren. – SachinSarawgi

0

Geben Sie, dass Ihre Frage scheint eine Übung, ich denke, wir sollten Ihnen keine Lösung, sondern einen Vorschlag, die zu erklären, wie man eine Lösung zu finden. Erstens, wenn Sie Java-Sammlungen in Ihrer Übung verwenden können, würde Set<String> Ihnen eine Verbesserung geben, weil es prüft, ob ein Wort dupliziert wird und Ihnen ein Set ohne Duplikate gibt.

Wenn Sie in Ihrer Übung nur Arrays verwenden können, müssen Sie eine andere Lösung verwenden. Ich schlage vor, zuerst auf dem unique Array zu iterieren, um zu überprüfen, ob es Duplikate gibt, und dann das unique Array zu sortieren.

Auf der anderen Seite können Sie mit Netbeans Schritt für Schritt Ihren Code ausführen (wie @f1sh vorgeschlagen).

0

Zunächst ist Ihre Logik nicht perfekt aussieht.

ArrayIndexOutOfBound ist wegen falscher Indizierung von Arrays unique & sentenceWords<= sowohl in den Schleifen mit < ersetzen auftreten, da die Länge der Array eine Anzahl von Elementen in dem Array ist & Indexierungs startet bei 0.

Wie gesagt bevor du wieder über deine Logik nachdenken solltest, da sie nicht perfekt ist. Sie können folgenden Trick verwenden, um Ihr Ziel zu erreichen.

Ersetzen Sie den folgenden Code mit dem Code zum Entfernen von Duplikaten & Sortieren Sie das Array ..

String[] unique = Arrays.stream(sentenceWords) 
    .distinct().sorted().toArray(String[]::new); 

Nach der Ausführung dieser Anweisung des Array unique enthalten verschiedene Elemente des Arrays sentenceWords in sortierter Form in lexikalischer Reihenfolge. Für weitere Details verweisen wir auf Javadocs.

Verwandte Themen