2014-09-17 3 views
0

Я пытаюсь создать программу, которая удаляет любые дубликаты строк, однако, с помощью кода ниже, который должен работать на моих глазах, я получаю исключение ArrayIndexOutOfBoundsException; хотя я не понимаю, почему.ArrayIndexOutOfBounds от управления списком

Кодекса

import java.util.Arrays; 
import java.util.ArrayList; 
import java.util.List; 

public class RemoveDuplicates 
{ 
     public static void main (String[] args) 
     { 
       List<String> numberSequence = new ArrayList<String>(Arrays.asList(args)); 

       for (int n = 0; n < numberSequence.size() - 1; n++) 
       { 
         System.out.println("\n==============================\nn element id: " 
                  + n + " ||| containing: " + numberSequence.get(n)); 

         for (int j = n+1; j < numberSequence.size(); j++) 
         { 
           System.out.println("j element id: " + j + " ||| containing: " + 
                    numberSequence.get(j)); 

           if(numberSequence.get(n).equals(numberSequence.get(j))) 
           { 
             System.out.println("*\nelement: ["+j+"] was removed\n*"); 
             numberSequence.remove(j); 
             n--; 
             j--; 
           } 
         } 
       } 
     } 
} 

Результат для командной строки арг:

============================== 
n element id: 0 ||| containing: 2 
j element id: 1 ||| containing: 10 
j element id: 2 ||| containing: 20 
j element id: 3 ||| containing: 10 
j element id: 4 ||| containing: 2 
* 
Element: [4] was removed 
* 
j element id: 4 ||| containing: 7 
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1 
    at java.util.ArrayList.elementData(ArrayList.java:400) 
    at java.util.ArrayList.get(ArrayList.java:413) 
    at RemoveDuplicates.main(RemoveDuplicates.java:17) 

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

Я неправильно понял (n + 1): th элемент занимает место n: th элемента, когда элемент n удаляется?

+1

Не можете просто добавить его в 'Set'? – prabugp

+0

Я думал об этом; но действительно ли это стоит хлопот? Мое предположение, и я думаю, что я непрофессионал, это то, что для этого потребуется больше вычислительной мощности. И поэтому я мог бы также узнать, почему проблема возникает сейчас. –

+2

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

ответ

1

Вы можете спасти себя неприятности выяснить, где проблема, просто заменив весь код этой строки:

List<String> unique = new ArrayList<>(new LinkedHashSet<>(Arrays.asList(args))); 

FYI, используя LinkedHashSet сохраняет порядок элементов, поэтому только последующее дубликаты удаляются.

Всегда нужно использовать библиотеки и API, которые поставляются с языком, прежде чем писать собственный код, чтобы что-то сделать. Меньший код хорош (пока он доступен для чтения).

+0

И он не будет использовать больше вычислительной мощности, множество реализаций очень оптимизировано. –

+0

Набор намного лучше, чем сопоставление с исходным кодом, размещенным OP, который имеет n^2 сложности – sol4me

+0

@Pablo Хорошо, я, хотя реализация набора была просто ключевым словом для любого типа List или Array. Не могли бы вы объяснить, что делает LinkedHashSet в моем случае? –

1

Ну, если я правильно понял, после удаления элемента для n == 0, j == 4, вы делаете n--; j--;. Поэтому в следующей итерации будет использоваться n = -1. Я думаю, что достаточно объяснить ArrayIndexOutOfBoundsException, так как вы используете numberSequence.get(n).

+0

Ну, а другой предоставил мне лучшую альтернативу коду, вы ясно дали понять, почему мой код, в частности, не работал так, как планировалось. –

0

Другим способом я рекомендую использовать Iterator для перебора коллекции и использования Iterator#remove() для удаления элемента.

Но если то, что вы действительно хотите, чтобы получить коллекцию никаких дубликатов не попробовать реализацию интерфейса Set:

Set collectionWithNoDuplicates = new HashSet(Arrays.asList(args));