Tablica[][] gdzie [x][]=liczba występująca w tab[] a [][x]= ilość wystąpień tej liczby

0

Mam zadanie by dla podanej w parametrze tablicy - tab zwrócić tablicę dwuwymiarową, gdzie pierwszy element będzie liczbą występującą w tablicy tab a drugi ilością wystąpień tej liczby.
Przykład dla tablicy int tab[]={1,2,2,1,3,2};
ma dać:
[1, 2],
[2, 3],
[3, 1]

Na radzie utknąłem na prostej pętli :-( i nie mam pomysły jak się do tego zabrać.

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

        int[] tab ={1,2,2,1,3,2};

    }
    static int[][] countOccurrences(int[] tab) {

        for ( int i = 0; i < tab.length; i++) {
            int count = 0;
            int numberOfTab = 0;
            for (int j = 0; j < tab.length; j++) {
                if(tab[i] == tab[j]) {
                    count++;
                }
            }
        }
        return tab;
    }
}
0

Witaj,

Spróbuj tak:

       // tablica wejsciowa 
        int[] tab = {1,2,3,5,2,3,1,2,8};

        // mapa, w której będą przechowywane wyniki
        Map<Integer, Integer> integers = new HashMap();

        for(int i=0 ; i<tab.length ; i++) {
            if (integers.containsKey(tab[i])) { // jeśli istnieje klucz z talicy to pobierz wartość i ją zwiększ
                int value = integers.get(tab[i]);
                integers.put(tab[i], ++value);
            } else {
                integers.put(tab[i], 1); // jesli nie istnieje to dodaj nowy wiersz
            }
        }

        // zrzucanie wyników z mapy do tablicy 2 elementowej
        int[][] result = new int[integers.size()][2];
        int index = 0;
        for(Map.Entry<Integer, Integer> entry : integers.entrySet()) {
            result[index][0] = entry.getKey();
            result[index][1] = entry.getValue();
            index++;
        }

        // wypisanie wyniku
        for(int i=0 ; i<result.length ; i++) {
            System.out.println(result[i][0] + " " + result[i][1]);
        }

}
0

Hmm.. coś tu chyba jest nie tak, bo tablica dwuwymiarowa to takie coś, co dostaje dwie wartości (współrzędne, argumenty), a zwraca jedną, np.:

int x = y[1, 3]; //zwraca jedną wartość i wpisuje do x, a pobiera dwie: 1 i 3

Ty natomiast, potrzebujesz czegoś takiego, żeby wsadzić jedną liczbę i otrzymać dwie.
wsadzasz indeks, dostajesz (liczbę) i (ilość wystąpień). Do czegoś takiego lepsza jest struktura albo cała klasa, jeżeli nie jesteś skąpy.

No chyba, że chcesz uporządkować te dane tak:
Mamy tablicę jednowymiarową a[] = {1, 1, 1, 2, 2, 4, 3, 4};
W tablicy dwuwymiarowej b[][] dane są tak uporządkowane, że

b[indeks][0] to liczba
b[indeks][1] to ilość wystąpień liczby.

Wtedy dla przypadku a[] = {1, 1, 1, 2, 2, 4, 3, 4};
b będzie mieć długość 4, a wyglądać będzie tak:

b[0][0] = 1 | b[0][1] = 3
b[1][0] = 2 | b[1][1] = 2
b[2][0] = 4 | b[2][1] = 2
b[3][0] = 3 | b[3][1] = 1

Czy może coś rozumiem źle?

0

Czy format odpowiedzi w postaci int[][] masz narzucony? Bo nie wydaje się on zbytnio sensowny (dla tab={1,10000} uzyskasz bez sensu dużą prawie pustą tablice). Lepsza była by mapa <Int, Long> i wtedy mozesz użyć streamow

0
danek napisał(a):

Czy format odpowiedzi w postaci int[][] masz narzucony? Bo nie wydaje się on zbytnio sensowny (dla tab={1,10000} uzyskasz bez sensu dużą prawie pustą tablice). Lepsza była by mapa <Int, Long> i wtedy mozesz użyć streamow

Tak. Format mam narzucony :-/

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