Tablica dwuwymiarowa, przekątne

0

Stworzyłem tablicę dwuwymiarową jednak nie wiem jak poprawnie zapisać następującą rzecz.
Program ma sprawdzić w przekątnych krotność występowania danej liczby i to wypisać.

 int[][] tab = new int[5][5];
		
		for(int i = 0 ; i <tab.length ; i++){
			for(int j = 0 ; j < tab[i].length ; j++){
			tab[i][j] = (int)(Math.random()*30);
				System.out.print(tab[i][j]+",  ");
			}
		System.out.println();
		}
		
		System.out.println();
		System.out.println();
		
		for(int i = 0 ; i<5;i++){
			int count = 1;
			for(int j = 1 ; j<5 ;j++)				
			if(tab[i][i] == tab[j][j])
				count++;
				
		System.out.println(tab[i][i] + " ile razy ? " + count);

Prosiłbym o pomoc, jestem w tej materii początkujący :)

0

czyli lecisz po przekątnych: [0][0], [1][1], [2][2]... i druga przekątna [4][0], [3][1]...
wrzuć to zgrabnie w pętelkę for i dla każdego po kolei sprawdzaj krotność :)
Czego dokładnie nie łapiesz?

0

Część teoretyczna ok, rozumiem itd.
Jednak wykonanie jest złe ... :/ i nie wiem jak poprawić.
Kombinowałem i nawet jeśli porównanie wychodziło poprawnie to zmienna count się nie "zerowała".
Niby banał a taki problematyczny.

0

Chodzi o to, że lecisz po przekątnych i zliczasz występowanie liczb? Jeśli tak, to:
0. Źle się poruszasz po tablicy. Niepotrzebnie robisz pętlę w pętli, bo przecież wiemy, że dla przekątnej x=y. Wystarczy przelecieć po array[i][i].

  1. Użyj map do zbierania informacji o występowaniu liczb. Kluczem niech będzie liczba, wartością - ile razy wystąpiła.
public static void countDiagonalNumbers(){
        int[][] array = fillArray(); // metoda zwracająca wypełnioną tablicę
        Map<Integer, AtomicInteger> countMap = new HashMap<>();
        for(int i=0; i<array[0].length; i++){
            if(countMap.containsKey(array[i][i])){
                countMap.get(array[i][i]).incrementAndGet();
            } else {
                countMap .put(array[i][i], new AtomicInteger(1));
            }
        }

        // ,,, analogicznie dla przekątnej idącej z lewego dolnego rogu

        // wypisujemy:
        for(Map.Entry<Integer, AtomicInteger> entry: countMap.entrySet()){
            System.out.println("Liczba " + entry.getKey() + " wystąpiła " + entry.getValue().toString() + " razy");
        }
}
0

Hm, dzięki ale tak jak mówiłem jest początkujący i jeszcze nie znam "array'a" jak i map. Nie można tego zrobić z kompletnymi podstawami typu pętla + warunek itd. ?

0
int szukane = ...
int licznik = 0;
int rozmiar = tab.length;
for(int w=0;w<rozmiar;w++)
{
    if(tab[w][w] == szukane)
    {
        licznik++;
    }
    if(tab[w][rozmiar-w-1] == szukane)
    {
        licznik++;
    }
}
0

Dzięki za bardziej uproszczony kod jednak czym są szukane, i czy w takim przypadku licznik nie będzie nabijany zbyt wiele razy ?

0

krotność występowania danej liczby

szukane to dana liczba
Masz rację, liczba wystąpień będzie zawyżona o jeden, jeśli szukana liczba znajduje się na przecięciu przekątnych . Trzeba skorygować:

if(rozmiar%2 == 1)
{
    if(tab[rozmiar/2][rozmiar/2] == szukane)
    {
        licznik--;
    }
}
0

ok rzecz w tym, że program ma za zadanie sam sprawdzić jakie to liczby są w przekątnych i wyświetlić ich krotność występowania

0

Szkoda, że tego nie napisałeś w pierwszym poście.
Jedyny sensowny sposób zrobienia zadania, to użycie mapy.

0

Od biedy możesz zastąpić mapę 30-elementową tablicą.

int[] array = new int[30];
for(int i = 0; i < 5; i++){         
    array[tab[i][i]] += 1;
}
0

Przy małym zakresie ([0,29]) liczb w tablicy to jest dobre rozwiązanie. Przy dużym zakresie, lepiej chyba emulować mapę tablicą dwuwierszową typu int[2*rozmiar_tablicy_wejściowej][2], w pierwszym wierszu pamiętamy liczby z przekątnych, w drugim ich krotności

1 użytkowników online, w tym zalogowanych: 0, gości: 1