2016-10-19 63 views
0

变量“num”是一个二维数组。我正试图检查该数组,如果有任何重复。 “num”是用户输入。Java - 二维数组,检查重复

我已经广泛地浏览了Java文档,并询问了我的讲座,我无法得到一个可行的答案。我理解这个概念,我的意思是做什么,但是无法获得正确的编码。

这里是我的代码:

for(int i = 0; i < 3; i++){ //3 rows with 5 numbers each 
     for(int j = 0; j < 5; j++){ 
      num[i][j] = Integer.parseInt(JOptionPane.showInputDialog(null, "Enter value for line: " + i + " and position: "+ j)); 
      if((num[i][j] == num[i][0]) || (num[i][j] == num[i][1]) ||(num[i][j] == num[i][2]) || (num[i][j] == num[i][3]) || (num[i][j] == num[i][4])){ 
       if(num[i][j] != 0){ 
        num[i][j] = Integer.parseInt(JOptionPane.showInputDialog(null, "ERROR. Enter value for line: " + i + " and position: "+ j)); 
       } 
      } 
     } 
    } 

我一直在使用的HashSet也试过,但我认为,只有与一维数组的作品。

我想用这样的事情,因为我觉得这个我理解的最:

secret = new Random().ints(1, 40).distinct().limit(5).toArray(); 

但显然不是随机的。

我已经试过这样:

Set<Integer> check = new HashSet<>(); 
    Random gen = new Random(); 

    for(int i = 0; i < 3; i++){ // 3 rows, 5 numbers 
     for(int j = 0; j < 5; j++){ 
      num[i][j] = Integer.parseInt(JOptionPane.showInputDialog(null, "Enter value for row " + i + " and position " + j)); 
      check.add(gen.nextInt(num[i][j])); 
     } 
    } 

编码(直接高于此)的最后一节编译和运行,但不会重复检查。

+0

你的问题对我来说有点不清楚。你是什​​么意思*“最后一个工作,但允许重复。”*? – user2004685

+0

清澈如泥。问题的质量与您将收到的答案的质量成正比。请阅读http://stackoverflow.com/help/how-to-ask –

+0

对不起,我的意思是最后的编码部分正在工作(即它将编译和运行),但它允许在最终输出中重复(未显示)。 –

回答

0

有替代方式为重复检查(例如,你可以循环回通过你之前输入到二维数组中的数据,以检查重复值)然而,这里是我如何使用Set来检查重复以便,您是否试图用所有唯一值填充2d数组,每个值来自用户?(另外 - 由于Michael Markidis明确指出了这一点,所以明确地知道这一点会很有帮助)

这里有一些UX知识,分离ERROR对最终用户有帮助,因为ERROR +在同一时间重新输入令人困惑。

import java.util.Arrays; 
import java.util.HashSet; 
import java.util.Set; 

import javax.swing.JOptionPane; 

public class App { 
    public static void main(String[] args) { 
     int[][] num = new int[3][5]; 
     System.out.println("Before:"); 
     for (int i = 0; i < 3; ++i) 
      System.out.println(Arrays.toString(num[i])); 
     Set<Integer> data = new HashSet<Integer>(); 
     for (int i = 0; i < 3; i++) { // 3 rows with 5 numbers each 
      for (int j = 0; j < 5; j++) { 
       boolean isGoodInput = false; 
       while (!isGoodInput) { 
        String input = JOptionPane.showInputDialog(null, "Enter value for line: " + i + " and position: " + j); 
        Integer n = Integer.parseInt(input); 
        if (data.contains(n)) { 
         JOptionPane.showMessageDialog(null, "ERROR: Try again"); 
        } else { 
         num[i][j] = n; 
         isGoodInput = data.add(n); 
        } 
       } 
      } 
     } 
     System.out.println("After:"); 
     for (int i = 0; i < 3; ++i) 
      System.out.println(Arrays.toString(num[i])); 
    } 
} 

注:二维数组仅限于您的规格在原岗位作为一个3x5的,所以你必须改变在多个地方这些值做出不同大小的阵列 - 也许使这些更加动态的可能加速在未来进一步开发此应用程序。

0

这里有一种方法,你使用的HashSet来跟踪那些已经被插入到二维数组来实现:

int[][] num = new int[3][5]; 
Set<Integer> check = new HashSet<>(); 

for (int i = 0; i < 3; i++) 
{ // 3 rows, 5 numbers 
    for (int j = 0; j < 5; j++) 
    { 
     int n = 0; 
     do 
     { 
      n = Integer.parseInt(JOptionPane.showInputDialog(null, "Enter value for row " + i + " and position " + j)); 

     } while (!check.add(n)); // keep looping if it was in the hashset 

     // add it to the array since we know n is not a duplicate at this point 
     num[i][j] = n; 
    } 
}