2017-02-22 8 views
-1

Я пытаюсь разработать программу, которая может сортировать строку и удалять дубликаты. Для этого я использую вложенные циклы. Однако, когда я запускаю свой код, он повторяет несколько слов снова и снова.Удалить дубликаты с вложенными циклами 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)); 
    } 
} 
} 

Это сообщение об ошибке я получаю:

[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 

Я использую Netbeans для этого. Любая помощь приветствуется. Спасибо Keir

+1

Отлаживайте свой код. – f1sh

+1

Почему бы вам просто не использовать 'Set' (например,' LinkedHashSet')? – Thomas

+5

Когда вы пишете цикл 'for' следующим образом:' for (int i = 0; i <= LenghtofSentence; i ++) 'вы проходите мимо конца вашего массива. Это должно быть '<' вместо '<='. – khelwood

ответ

-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

Я не знаю, почему вы используете для этого цикл и делаете его сложным.

Это можно сделать просто используя Set в java. Set - это коллекция, которая не содержит повторяющихся элементов. Для получения дополнительной link

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

Это автоматически удалит дубликаты. Вы можете получить обратно ваш массив без дубликатов из Set следующим образом:

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

Также импортируем следующее перед использованием выше кода:

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

Использование LinkedHashSet сохранит порядок, в котором слова присутствовали в массиве , Надеюсь, поможет.

+1

Используйте 'LinkedHashSet' для сохранения порядка слов. –

+0

Да, обновит код. – SachinSarawgi

0

Дайте, чтобы ваш вопрос казался упражнением, я думаю, мы не должны дать вам решение, а предложение, объясняющее, как найти решение. Во-первых, если вы можете использовать коллекции Java в своем упражнении, используйте Set<String>, что даст вам улучшение, потому что оно проверяет, дублируется ли слово и дает вам набор без дубликатов.

Если в вашем упражнении вы можете использовать только массивы, вам нужно использовать другое решение. Я предлагаю сначала перебрать массив unique, чтобы проверить, есть ли дубликаты, а затем отсортировать массив unique.

С другой стороны, Netbeans позволяет вам выполнять свой код шаг за шагом (как предлагалось @ f1sh).

0

Прежде всего, ваша логика не выглядит безупречной.

ArrayIndexOutOfBound это происходит из-за неправильной индексации массивов unique & sentenceWords заменить <= с < в обоих циклах, так как длина массива является числом элементов в индексации массива & начинается с 0.

Как я уже сказал прежде чем вы снова подумаете о своей логике, поскольку она не идеальна. Вы можете использовать следующий трюк для достижения своей цели.

Заменить следующий код кодом, чтобы удалить дубликаты & сортировать массив ..

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

После выполнения этого заявления массива unique содержат различные элементы массива sentenceWords в отсортированном виде в лексикографическом порядке. Подробнее см. Javadocs.