/ / Як я можу знайти та підрахувати дублікати у двовимірному масиві? - java, масиви, for-loop

Як знайти та підрахувати дублікати в 2-х мірному масиві? - java, масиви, для-петлі

Привіт, я намагаюся пройти двовимірниймасив (конкретно масив 4x4) і обидва знаходять будь-які числа, які повторюються, а потім підраховують кількість разів, яку число повторює. Поки що у мене є 4 петлі робота проте робити більше, ніж те, що я дійсно хочу.

int counter1 =1;
String huh="";

for (int x = 0; x< dataTable.length; x++)
{
for (int y=0; y< dataTable.length; y++)
{
for (int z = 0; z< dataTable.length; z++)
{
for (int a=0; a< dataTable.length; a++)
{
if ( x != z && x !=a && y != z && y !=a)
{
if (dataTable[x][y] == dataTable[z][a])
{
counter1++;
}
}
}
}
if (counter1 > 1)
{
huh += ("n " + dataTable[x][y] + " repeats " + counter1 + " times!");
}
counter1=1;
}
}

В основному це працює в тому сенсі, що цепорівнює кожне число в моєму масиві з кожним іншим числом, включаючи себе (але оператор if не дозволяє йому рахувати себе). В основному мені потрібен вихід, щоб заявити щось просте на кшталт

The number 3 repeats 3 times

Однак із тим, як працює моя установкадодайте до рядка той самий вислів кожного разу, коли він порівнював число 3 у кожному з його місць у моєму масиві. Тож моя методика взагалі правильна і потребує лише певного налаштування? чи взагалі це неправильно, і мені потрібно щось зовсім інше? У моєму коледжі я лише на початковому уроці програмування, тому ми знаємо лише основи Java на сьогоднішній день, як масиви, цикли та деякі інші речі.

Відповіді:

1 для відповіді № 1

Просто перетворіть цей масив у Map<Integer, Integer> а потім роздрукуйте його так:

    public static void main(String[] args) throws Exception {
final int[][] dataTable = new int[][] {
new int[] {0, 1, 2, 1},
new int[] {0, 1, 3, 1},
new int[] {0, 1, 2, 2},
new int[] {0, 1, 2, 0}
};

final Map<Integer, Integer> map = new HashMap<Integer, Integer> ();
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
final int value = dataTable[i][j];
final Integer currentCount = map.get(value);
final Integer newCount;
if (currentCount == null) {
newCount = 1;
}
else {
newCount = currentCount + 1;
}

map.put (value, newCount);
}
}

for (final Map.Entry<Integer, Integer> entry : map.entrySet()) {
System.out.println(String.format ("The number %d repeats %d times", entry.getKey(), entry.getValue()));
}
}

Ось тут ви можете знайти результати.


1 для відповіді № 2

Я думаю, що найкращим підходом було б підтримання Map<Integer, Integer> що відстежує числові частоти (тобто він відображає кожне число в масиві до кількості разів, коли воно з'являється). Не важко буде прокрутити весь масив і відповідно оновити цю карту. Здається, що ти зараз робиш шлях складніше, ніж це насправді потрібно (на мою думку).

І для чого ви використовуєте 4 for-петлі? Можливо, я не розумію мету вашого конкретного коду, але вам знадобиться лише два, щоб переключитися на 2D-масив (і в кінцевому рахунку підрахувати число-частоти):

for (int[] a : array)
for (int i : a)
// do something

Відповідна документація:


0 для відповіді № 3

Найбільш загальне рішення - використовувати карту, як запропонували інші. Однак якщо значення масиву знаходяться у відносно невеликому діапазоні, ви можете використовувати масив замість карти. Якщо min є (щонайбільше) найменшим значенням у масиві та max є (принаймні) найбільшим значенням:

public int[] getFrequencyMap(int[][] array, int min, int max) {
int[] map = new int[max - min + 1];
for (int[] row : array) {
for (int val : row) {
map[val - min]++;
}
}
return map;
}

У поверненому масиві значення в індексі val - min буде число разів, яке значення val відбувається в масиві.


0 для відповіді № 4

У вас може бути масив з n * n рядків та 2 стовпців:

/*being n the number of rows/columns*/
int count[]][] = new int[n*n][2];

for (int i = 0; i < dataTable.length; i++) {

for (int k = 0; k < dataTable.length; k++) {

/*this loop finds the position in which it should go*/
for (int h = 0; h < n*n; h++) {
if (count[h][0] == dataTable[i][k]) {
break;
}

/*Assuming that "0" is not a possible number in dataTable, use "-1" or a number that */
if (count[h][0] == 0) {
break;
}
}

count[h][0] = dataTable[i][k];
count[h][1]++;
}
}