3

我必须找到并列出数组中所有重复的索引值。

示例:int[] 数组 = { 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 是的,完整的程序是一团糟,但它完成了工作,我对此感到非常头疼。另请注意,在完整程序中,如果检测到重复值作为额外学分,教授要求我们抛出异常。我做到了,但我将其注释掉以完成原始作业,因此请忽略它。

4

5 回答 5

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()

演示在这里。

于 2012-06-18T17:58:30.340 回答
1

我认为您应该使用 aList来记录索引

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
}
于 2012-06-18T17:30:52.297 回答
1

只有两个 for 循环怎么样?

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);
    }
  }
}
于 2016-10-04T01:53:33.980 回答
0

当您遍历数组时,您将使用 line 覆盖任何先前找到的索引index = p;。此行仅在出现一次正在搜索​​的值时才有效。让index成为一个字符串,并在每次到达那条线时连接到它,这样index += " "+p;. 您的线路:

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

然后将打印出正在搜索的值的所有找到的索引。

因此,有几种方法可以完成您的解决方案(有些天真,有些是最佳)。您应该仔细考虑您要实现的目标,并在遇到问题时弄清楚代码(调试)中的每一行都在做什么。

于 2012-06-18T17:41:41.953 回答
0

一种选择是创建一个使用该值作为键的 HashMap,并为该值创建一组索引。当您扫描数组时,如果该值不在 HashMap 中,请使用新的索引集合添加它。如果值在数组中,则拉取集合,添加下一个索引并完成迭代。

完成后,迭代 HashMap,任何具有 size() > 1 值的条目都有重复项。

于 2012-06-18T17:31:33.340 回答