многомерный массив без повторяющихся чисел в одной строке - PullRequest
0 голосов
/ 10 сентября 2018
  int matrice2 [][] = new int [5][5];
  for (int i=0;i<5;i++) {
      System.out.println(" ");
      for(int j=0;j<5;j++) {
          matrice2[i][j] = (int)(Math.random()*10);
          System.out.print(" "+matrice2[i][j]+" ");
      }
  }
  System.out.println(" ");
  System.out.println(" ");
  for (int i=0;i<5;i++) {
      System.out.println(" ");
      for(int j=0;j<5;j++) {
          for (int k=0;k<5;k++) {
              if(j!=k) {
                  if (matrice2[i][j]==matrice2[i][k]) {
                      matrice2[i][k]=(int)(Math.random()*10);
                  }
              }
          }
          System.out.print(" "+matrice2[i][j]+" ");
      }
  }

Я хотел создать многомерный массив без повторяющихся чисел в одной строке, чтобы столбец не имел значения, если в нем повторяющиеся числа.

Я создал генерируемые массивы 5x5.на площадиИмея индекс "j", который сравнивается с числами в индексе "k", который проверяет всю строку, если есть числа, которые равны числу, которое он содержит в индексе "j".Поэтому моя единственная проблема состоит в том, что после определения числа в «k», которое равно числу в «j», число в индексе «k» сгенерирует новое число, заменяющее текущее число в «k», но результат в консолипоказывает, что исходный массив 5x5, который является первым сформированным массивом до того, как он был изменен, был изменен, но замененные числа генерировали числа, которые уже существуют, даже если они должны продолжать изменяться, пока «k» не сможет обнаружить повторяющиеся числа.1004 *

Я могу придумать другие способы сделать это, но я действительно хочу знать, почему это не работает, хотя я действительно думаю, что это не должно создавать никаких проблем, но я мог что-то упустить.

вот пример результатов, которые не должны были быть получены.

из

9 1 3 8 4
5 3 2 4 8
9 8 5 6 5
6 3 0 8 7
2 8 6 3 9

до

9 1 3 84
5 3 2 4 8
9 8 5 6 9
6 30 8 7
2 8 6 3 9

этого не должно произойти, потому что "k" должен был это видеть, поскольку он начинает с индекса 0 до 4.

, в то время как "j"в индексе 4 и "k" находится в индексе 0, он должен был немедленно его обнаружить и изменить число в "k" на что-то другое случайное.Просьба предоставить лучшее решение без использования импорта.наш учитель дал нам это задание, сказав нам, не используя какой-либо из этих импортов, что делает его более сложным, но это то, что нас просят.Я пробовал это время, но изменений по-прежнему не было.

Ответы [ 5 ]

0 голосов
/ 10 сентября 2018

Я изменил ваш код по-другому.Я написал некоторый комментарий, чтобы код был понятенПопробуйте, пожалуйста.

public class UniqueMatrix {
    public static void main(String[] args) {

        int matrix[][] = new int[5][5];
        boolean uniqeMatrixFound = false;
        while (!uniqeMatrixFound) {
            //fill matrix until uniqe matrix found value is true 
            fillMatrix(matrix);
            for (int i = 0; i < matrix.length; i++) {
                HashSet<Integer> columnNumber = new HashSet<>();
                for (int j = 0; j < matrix.length; j++) {
                    columnNumber.add(matrix[j][i]);
                }
                //if set size not equal to matrix size , create an new uniqe matrix with breaking false value
                if (columnNumber.size() != matrix.length) {
                    uniqeMatrixFound = false;
                    break;
                }
                uniqeMatrixFound = true;
            }
        }

        //print an array 
        for (int i = 0; i < matrix.length; i++) {
            System.out.println(" ");
            for (int j = 0; j < matrix.length; j++) {
                System.out.print(" " + matrix[i][j] + " ");
            }
        }

    }

    //create a matrix with unique value in all rows.
    private static void fillMatrix(int[][] matrice2) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i < 10; i++) {
            list.add(i);
        }
        for (int i = 0; i < matrice2.length; i++) {
            Collections.shuffle(list);
            for (int j = 0; j < matrice2.length; j++) {
                matrice2[i][j] = list.get(j);
            }
        }
    }

}
0 голосов
/ 10 сентября 2018

То, как я читаю вашу логику, заключается в том, что когда вы находите дубликат, вы генерируете новый номер, и этот новый номер будет проверен на следующей итерации внешнего (j) цикла.Проблема в том, когда j==k, потому что это число не будет проверено, обычно это не проблема, поскольку j будет увеличиваться, и тогда это число будет проверяться, за исключением случая, когда j==4, поскольку это последняя итерация.

Поэтому измените крайний правый столбец, и это значение не будет проверено, поскольку 'j == k' никогда не будет ложным.

0 голосов
/ 10 сентября 2018

Вот другой подход к проблеме, который использует перетасованный ArrayList вместо проверки, существует ли значение в текущей строке или нет.

int matrice2[][] = new int[5][5];
ArrayList<Integer> sourceMatrix = new ArrayList<Integer>();

for (int i = 0; i < 10; i++)
    sourceMatrix.add(i);

//generate random matrix using shuffled arraylist
for (int i = 0; i < matrice2.length; i++) {
    Collections.shuffle(sourceMatrix);
    for (int j = 0; j < matrice2[i].length; j++) {
        matrice2[i][j] = sourceMatrix.get(j);
    }
}

//print generated matrix
for (int i = 0; i < matrice2.length; i++) {
    for (int j = 0; j < matrice2[i].length; j++) {
        System.out.print(matrice2[i][j]);
    }
    System.out.println();
}
0 голосов
/ 10 сентября 2018

Проблема в вашем коде заключалась в том, что после того, как вы обнаружили дублирующее значение, вы присвоили новое сгенерированное случайное число, не проверяя, является ли оно также дублирующим числом.я обнаружил дубликат, и перед назначением / заменой нового сгенерированного случайного числа я проверил, является ли он также дублированным или нет, если он дублируется, я сгенерирую другое, в противном случае я назначу его и продолжу.

(int)(Math.random()*10); // this code does not guarantee that new unique number is generated every time you call it.

проблема в коде ниже, вы обновляете matrice2[i][k] новым (int)(Math.random()*10) без проверки, является ли он тем же или другим номером.

          if (matrice2[i][j]==matrice2[i][k]) {
              matrice2[i][k]=(int)(Math.random()*10);
          }
0 голосов
/ 10 сентября 2018

Вот ваш код отредактирован.Я также прокомментировал, что были изменения и почему.Вы могли бы сделать это проще, но я думаю, что вам больше подходит редактировать ваш пример, чтобы вы могли понять.Единственная проблема заключается в том, что вы должны были сохранить значение в matrice2 [i] [j] = newValue (чтобы позволить k перейти в конец строки и проверить со всеми другими значениями, что ваше случайное число не является существующим числом)

Надеюсь, это поможет.

public class UniqueMatrix {

    public static void main (String[] args) {
        int matrice2 [][] = new int [5][5];
        for (int i=0;i<5;i++) {
            System.out.println(" ");
            for(int j=0;j<5;j++) {
                matrice2[i][j] = (int)(Math.random()*10);
                System.out.print(" "+matrice2[i][j]+" ");
            }
        }
        System.out.println(" ");
        System.out.println(" ");
        for (int i=0;i<5;i++) {
            System.out.println(" ");
            for(int j=0;j<5;j++) {
                for (int k=0;k<5;k++) {
                    if(j!=k) {
                        if (matrice2[i][j]==matrice2[i][k]) {
                            int newValue = (int)(Math.random()*10);
                            //store the newly found value in j for you have time to check with others till the end
                            matrice2[i][j] = newValue;
                        }
                    }
                }
                System.out.print(" "+matrice2[i][j]+" ");
            }
        }
    }
}
...