2016-10-19 2 views
0

변수 "num"은 2D 배열입니다. 해당 배열이 있는지 확인하려고합니다. 중복이 있으면. "num"은 사용자 입력입니다.Java - 2D 배열, 중복 검사

나는 자바 문서를 광범위하게 살펴본 후 강의를 물었고 정상적인 답변을 얻을 수 없었다. 나는 개념을 이해하고, 내가 의도 한 바가 있지만, 코딩 권리를 얻을 수는 없다.

여기 내 코드입니다 : 나는 또한 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 차원 배열을 채우려고합니까? 여기서 각 값은 사용자가 보낸 값입니다. ?? (또한 - 원래 게시물에 명시 적으로 명시하는 것은 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])); 
    } 
} 

참고 : 다른 크기의 배열을 만들기 위해 여러 장소에서이 값을 변경해야 할 것, 그래서 2 차원 배열하는 3X5로 원래의 게시물에 사양에 제한됩니다 - 아마도 속도를 높일 수있는 이러한 역동적 인을 앞으로이 애플리케이션의 추가 개발이 필요하다.

0

다음은 이미 2D 배열에 삽입 된 내용을 추적하기 위해 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; 
    } 
}