2016-10-19 64 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; 
    } 
}