Zliczanie wartości w tablicy

0

Witam
Mam problem ze zliczaniem danych w tablicy. Mianowicie przy dwuwymiarowej tablicy muszę dla każdego ostatniego jej elementu w rzędzie policzyć ile jest jego możliwych różnych wystąpień wartości oraz ile razy każda z tych wartości występuję.
Na razie staram się to zrobić na przykładowej małej tablicy sprawdzając czy wszystko się zgadza. Wymyśliłem, że skoro do kolekcji elementy dodawane są bez powtórzeń to łatwo określić samą ich liczbę jako opcji wartości, jednak nie mam pojęcia jakbym mógł jeszcze zliczyć ich ilość dla każdej nich. Jeśli chodzi o try-catch to jest on dlatego że wychodziłem poza tablice przy ostatniej iteracji(do końca też nie rozumiem dlaczego), wiem że jest to bardzo "studenckie" obejście problemu.
(Mam nadzieję, że w miarę zrozumiale opisałem mój problem, dopiero zaczynam a to mój pierwszy post tutaj ;) )

import java.util.HashSet;
import java.util.Set;
 
public class Main {
   
   
    public static void main(String[] args) {
       
        int zmienna = 0;
 
        Set<Integer> zbior = new HashSet<Integer>();
 
        int[][] tab = new int[][] { { 1, 2, 3, 4, 5 }, { 6, 7, 8, 9, 10 }, { 11, 12, 13, 14, 15 },
                { 16, 17, 18, 19, 20 }, { 16, 17, 18, 19, 20 }, { 16, 17, 18, 19, 20 }, { 16, 17, 18, 19, 20 },
                { 16, 17, 18, 19, 20 } };
        System.out.println(tab.length);
        System.out.println("=====");
        try {
            for (int i = 0; i < tab.length; i++) {
                for (int j = 0; j < tab[i].length; j++) {
 
                    zmienna = tab[i][tab[j].length - 1];
 
                    zbior.add(zmienna);
 
                    for (int j2 = 0; j2 < tab.length; j2++) {
                        for (int k = 0; k < tab[j2].length; k++) {
 
                            if (zmienna == tab[i][tab[j].length - 1]) {
 
                            } else {
 
                            }
                        }
                    }
                    System.out.println(tab[i][tab[j].length - 1]);
 
                    i++;
 
                }
                // System.out.println();
            }
 
        } catch (Exception e) {
            System.out.println("KONIEC");
        }
 
        for (int lol : zbior) {
            System.out.println(lol);
 
        }
 
    }
 
}
0

Dodaj jakie powinny być prawidłowe wyniki, dla tablicy która podałeś wyżej. Będzie nam łatwiej Cię zrozumieć co miałeś na myśli.

1

Nie wiem czy dobrze zrozumiałem, ale jeśli chcesz zliczyć ile razy w całej tablicy wystąpił każdy element z każdego ostatniego wiersza, to możesz to łatwo zrobić używając streamów i nie bawić się w poczwórnie zagnieżdżone pętle:

		Map<Integer, Long> valueCount = Arrays.stream(tab)
			.flatMapToInt(Arrays::stream)
			.boxed()
			.collect(
				Collectors.groupingBy(
					Function.identity(),
					Collectors.counting()
				)
			);
		Arrays.stream(tab)
			.map(it -> it[it.length - 1])
			.distinct()
			.forEach(it ->
				System.out.println("Value " + it  + " found " + valueCount.getOrDefault(it, 0L) + " times")
		);
0
Peaky_Duck napisał(a):

dla każdego ostatniego jej elementu w rzędzie policzyć ile jest jego możliwych różnych wystąpień wartości oraz ile razy każda z tych wartości występuję.

Musisz to doprecyzować, najlepiej podaj to co według Ciebie powinno zostać zwrócone jako prawidłowy wynik.

Natomiast jeśli chcesz zliczyć wystąpienia elementów tablicy, a nie ogarniasz streamów na takim poziomie jak odpowiedź powyżej (tak zakładam skoro zaczynasz naukę), możesz po prostu użyć Mapy.

  1. Tworzysz pusta mapę o odpowiednich typach
  2. Przechodzisz po tablicy, dochodzisz do momentu który chcesz zliczyć
  3. Sprawdzasz czy obiekt istnieje już w mapie, jak tak to pobierasz value dla niego i zwiększasz o 1. Jesli nie istnieje to dodajesz do mapy z wartością 1.
  4. Wróć do punktu 2 aż do końca tablicy

Co do try catcha, nie używa się tego aby "ukryć" błąd, a go wyłapać i wrzucić w logi przyczynę błędu.
To, że wychodziłeś poza zakres tablicy to jest wina złego kodu.

0

Niestety ale nie o to do końca mi się rozchodziło. Potrzebuje informacji o tym ile jest "opcji" na ostatnią liczbę w rzędzie (5,10,15,20) czyli opcji jest 4, i dla każdej z nich będę dalej musiał coś oddzielnie liczyć stąd też potrzebuje ich liczności (dla 5-1, 10-1, 15-1, 20-4). Problem jest taki że w rzeczywistości tablica jest typu String a ja nie znam jej wartości i nie wiem ile będzie tych "opcji" dla których są oddzielne metody. Cały algorytm będzie miał za zadanie liczyć różne prawdopodobieństwa.

0

Nie wiem jak inni ale ja dalej nie rozumiem co chcesz nam przekazać. Jakie "opcje"? Czemu akurat 5 10 15 20? Co to znaczy nie znam wartości tablicy stringów?

Podaj przykładowe 2 tablice na wejściu oraz to co powinno z nich wyjść, nie mówię o tej części z prawdopodobieństwem, a tylko o tych licznościach.

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