2012-06-18 1 views
2

Мне нужно найти и перечислить все повторяющиеся значения индекса в массиве.Java - перечисление индекса повторяющихся значений в массиве int

Пример: int [] array = {0, 7, 9, 1, 5, 8, 7, 4, 7, 3};

7 находится в трех разных местах по индексу 1, 6 и 8. Как я могу изменить свой существующий код, чтобы иметь outputResults.setText() показать местоположение дубликатов значений? outputResults.setText() - это JTextField, если это помогает.

String tmp1 = getNumbers.getText(); 
    try { 
     int search = Integer.parseInt(tmp1); 
     for (p = 0; p < array.length; p++) { 
      if(array[p]==search) { 
       b = true; 
       index = p; 
      } 
     } 
     if(b==true) 
      outputResults.setText(search + " was in the following fields of the array " + index); 
     else 
      throw new NumberNotFoundException("Your number was not found."); 


    } catch (NumberFormatException ex) { 
     JOptionPane.showMessageDialog(getContentPane(), "You can only search for integers."); 

    } catch (NumberNotFoundException ex) { 
     JOptionPane.showMessageDialog(getContentPane(), ex.getMessage()); 
    } 

В его нынешнем состоянии, то это будет только список в последний раз находился дубликат номер, который будет индекс 8 основан на моем примере. Список чисел в массиве вводится пользователем, и мне не разрешено сортировать значения. Мое первоначальное предположение заключалось в создании вложенного цикла и всякий раз, когда он находил дублированный номер, добавьте p (текущий индекс, который он ищет) в новый массив. Затем я бы перечислил полный массив в outputResults.setText(), но он дал несколько предупреждений и ошибок, когда я пытался.

Полный код можно найти здесь, если необходимо: http://pastebin.com/R7rfWAv0 И да, полная программа - это беспорядок, но она выполняет свою работу, и у меня была такая головная боль с ней. Также обратите внимание, что в полной программе профессор попросил нас выбросить исключение, если дублирующее значение было обнаружено как дополнительный кредит. Я сделал это, но я прокомментировал это, чтобы закончить первоначальное задание, поэтому, пожалуйста, не обращайте на него внимания.

+0

Я считаю, что ответ достаточно очевиден, если подумать об этом немного. То есть, на мой взгляд, цель домашней работы. Возможно, вместо того, чтобы сохранять индекс, вы могли бы сделать что-то еще ... – Morfic

+0

Если честно, я думал то же самое, но, глядя на задание в течение нескольких часов, вы, как правило, забываете основы. Я работаю над этим довольно долго, но я не могу заставить его работать правильно. Моей главной задачей было отобразить массив индексов в JTextField в одной строке. – user1462300

ответ

1

Я думаю, вы должны использовать List для записи индексирование

List<Integer> indexs =new ArrayList<Integer>(); 
for (p = 0; p < array.length; p++) { 
    if(array[p]==search) { 
     indexs.add(p); 
    } 
} 
if(p.length()>0){ 
    //print the result 
} 
+0

Мы еще не прошли список в классе, но после прочтения об этом в оракулах, похоже, он может выполнить свою работу. Единственная проблема заключается в том, что eclipse говорит мне: «Список типов не является общим, его нельзя параметризовать аргументами ». Я буду смотреть дальше, спасибо за подсказку! – user1462300

+0

@ user1462300 Просто используйте '' в порядке. '' is invalid.see http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf для более подробной информации. – plucury

0

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

После того, как это будет завершено, выполните итерацию HashMap, любая запись, у которой есть значение с размером()> 1, имеет дубликаты.

+0

Извините, но я не знаю, что такое HashMap. Мы никогда не сталкивались с чем-либо, связанным с ним в классе. Не могли бы вы немного объяснить это? Тем временем я исследую это. – user1462300

+0

http://docs.oracle.com/javase/6/docs/api/java/util/HashMap.html В принципе, это хэш-таблица, но реализована с использованием интерфейса Map Collection. – Michael

0

Как вы итерируете через массив, вы переписываете любой найденный ранее индекс с помощью строки index = p;. Эта строка работает только в том случае, если есть одно вхождение искомого значения. Пусть index является строкой и согласуется с ней каждый раз, когда вы приходите на эту строку, так что index += " "+p;. Ваша строка:

outputResults.setText(search + " was in the following fields of the array " + index); 

затем распечатает все найденные индексы для искомого значения.

Итак, есть несколько способов завершить ваше решение (некоторые наивные и некоторые оптимальные) с тем, что сказано; вы должны продумать то, что вы пытаетесь достичь, и выяснить, что каждая строка делает в вашем коде (отладка), когда у вас есть проблема.

+0

О, ничего себе, не могу поверить, что я забыл о + =. Это действительно сработало отлично! И да, я знаю, что есть несколько способов добиться желаемых результатов, но, как я уже говорил, когда вы работаете над чем-то в течение длительного периода времени, вы, как правило, забываете основы и простые методы ведения дел. Спасибо огромное! – user1462300

+0

Если это помогло решить вашу проблему, отметьте ее как принятую. Пометить отметку в количестве голосов. – Donnie

1

Нет необходимости в хэш-таблицы, списки или любой другой, вы можете сделать это очень легко, как так:

int [] array = { 0, 7, 9, 1, 5, 8, 7, 4, 7, 3}; 
int pointer=0; 
int currNumber; 
while(pointer<array.length) 
{ 
    currNumber=array[pointer]; 
    for(int i=0;i<array.length;i++){   
    if(currNumber==array[i] && i>pointer){ 
     System.out.println("Duplicate for "+currNumber +" in " +i); 
     break; 
    } 
    } 
    pointer++; 
} 

Это будет печатать все дубликаты для всех чисел в массиве.

Duplicate for 7 in 6 
Duplicate for 7 in 8 

Очевидно, что вы, вероятно, придется объединить строку и отобразить ее в конце цикла, вызвав outputResults.setText()

Demo here.

1

Как насчет всего два для петель?

for (int i = 0; i < array.length; i++) { 
    for (int j = 0; j < array.length; j++) { 
    if (array[i] == array[j]) { 
     System.out.println("Duplicate - " + array[i] + " found at index " + i + " and " + j); 
    } 
    } 
} 
Смежные вопросы