2016-10-19 12 views
0

変数 "num"は2D配列です。重複がある場合、その配列をチェックしようとしています。 「num」はユーザー入力です。Java - 2D配列、重複チェック

私はJavaのドキュメントを幅広く見て、私の講義に尋ねましたが、うまく答えられません。私はその概念を理解していますが、私は何をするつもりですが、コーディングの権利を得ることはできません。

は、ここに私のコードです:私もHashSetのを使用してみましたが

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)); 
       } 
      } 
     } 
    } 

が、私は唯一の1次元配列で動作することを考えます。

私はこのことを感じるように私はほとんど理解し、このようなものを使用したいと思います:

ランダムで
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

(重複をチェックする代わりの方法があります。例えば、あなたが戻ってループを通過する可能性あなたは重複した値をチェックするために2D配列に以前に入力したデータ)しかし、ここで私は、Setを使って重複をチェックして、次のようにします:2次元配列にすべての一意の値各値はユーザーからのものですか?ここで少しUXの知識を持つ - (オリジナルのポストで明示的にこれを知ることは非常に参考になる、ということを指定するためのマイケルMarkidisのおかげでも)

、ERRORを分離すると、ERROR +として、エンドユーザーへのDEF便利です同時に再入力すると混乱します。

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])); 
    } 
} 

注:2D配列は、3×5のようにオリジナルのポストであなたの仕様に制限されているので、あなたは、異なるサイズの配列を作るために複数の場所でこれらの値を変更する必要があるだろう - おそらく、これらのよりダイナミックでスピードができ作ります今後このアプリケーションのさらなる開発を進めてください。

0

は、ここでは、すでに2次元配列に挿入されたものを追跡するための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; 
    } 
} 
関連する問題