Unikatowe słowa -> przeszukanie tablicy i wypisanie ich.

0

Chcę dodać to do mojego programu z tego tematu -> Alfabet fonetyczny angielski - IPA jak wyświetlić? po wczytaniu danego tekstu w string tablica[rozmiar];, przechowuję sobie wszystkie słowa z całego tekstu z powtórzeniami.

I teraz chciałbym po prostu tą tablicę przekształcić w taką, która będzie zawierała tylko unikatowe słowa bez powtórzeń. Zacząłem po prostu od tego, żeby wypisać sobie w konsoli tylko słowa z powtórzeniami, ale tylko raz, żebym mógł później sobie łatwo je zapisać do pliku, ale właściwie nie mam pomysłu na algorytm, i mam problem, bo robię to po prostu dwoma pętlami for, czyli tak:

	for(int k=0;k<liczba;k++)
	{
		for(int j=0;j<liczba;j++)
		{
			if(tablica[k]==tablica[j] && k!=j && flaga!=1)
			{
				cout<<"Wyraz z powtórzeniem"<<tablica[k]<<endl;
				flaga=1;
			}
		}
		flaga=0;
	};

Ale te warunki w if'ie nie są wystarczające, bo przypuśćmy, że w 0,10,22,44 elemencie tablicy jest słówko 'the'.

I zostanie ono wydrukowane dokładnie 4 razy, bo if sprawdzi 0->10 (0->22, 0->44 już nie, bo zapewnia mi to flaga) oraz później 10->0, 22->0, 44->0 i jak sobie z tym poradzić, może do czasu kiedy mi odpiszecie już coś wymyślę, ale czekam na Waszą pomoc.

0

Po każdym wyciągnięciu pojedynczego słowa, sprawdzasz w całej tablicy czy to słowo wcześniej wystąpiło, czyli porównujesz znalezione słowo z każdym innym w tablicy. Jeśli wystąpiło, to nic nie robisz i powtarzasz czynność. Jeśli nie wystąpiło, to je dodajesz do tablicy.

0
amb00 napisał(a):

Po każdym wyciągnięciu pojedynczego słowa, sprawdzasz w całej tablicy czy to słowo wcześniej wystąpiło, czyli porównujesz znalezione słowo z każdym innym w tablicy. Jeśli wystąpiło, to nic nie robisz i powtarzasz czynność. Jeśli nie wystąpiło, to je dodajesz do tablicy.

Nie wiem czy o to Tobie chodziło. Zrobiłem tak niby działa, jeszcze sprawdzę manualnie czy faktycznie się zgadza:

for(int k=0;k<slow_w_tekscie;k++)
	{
		for(int j=0;j<slow_w_tekscie;j++)
		{
	/**********		sprawdzam każde wyciągnięte słowo z tablicą z unikatowymi słowami, jeśli w całej tablicy unikatowych słów, nie będzie danej instancji wyciągniętego słowa 'unikat' będzie wynosił rozmiar tablicy na unikatowe słowa (
rozmiar ten wynosi tyle ile słów jest w tekście, czyli tablica jest po prostu nadmiarowa) ***/


				for(int i=0; i<slow_w_tekscie;i++)
				{
					if(tablica[k]!=unikaty[i])
					{
						unikat++;
					}
				}
				//Jeśli nie ma instancji wyciągniętego słowa zapisujemy je do tablicy unikatowych słów jeśli nie zerujemy int unikat
				if(unikat==slow_w_tekscie)
				{
				unikaty[licznik]=tablica[k];
				licznik++;
				}
				else
				{
					unikat=0;
				}
				
				
			
			
		}
		
		
	};
		
     
    
    // Wyświetlanie
    cout<<endl<<endl<<endl;
    for(int i=0;i<slow_w_tekscie;i++)
    {
    	cout<<"Unikat "<<i<<" : "<<unikaty[i]<<endl;
	}

PS: Nie wiem jak tu wstawiać dłuższy kod, żeby było kolorowanie składni?

@Edit

Działa jak należy dodałem jeszcze zliczanie wystąpień danego słowa, liczba ta jest wypisywana przy każdym unikatowym słowie, także dzięki za pomoc mam to co chciałem.

1
AndkowyUczeń napisał(a):

PS: Nie wiem jak tu wstawiać dłuższy kod, żeby było kolorowanie składni?

Podczas pisania posta kliknij ostatni guzik ten z trójkącikiem w dół i wybierz język programowania.

0

Zrób to tak. Masz tablicę ze słowami. Za pomocą strumienia zamień ją na kolekcję set - voila, gotowe.
Tak na szybko coś napisałem:

    public static void main(String[] args) {
        String[] words = {"mama", "tata", "mama", "tata", "brat"};
        Set<String> uniqueWords = Arrays.stream(words)
                .collect(Collectors.toSet()); // konwersja na set
        uniqueWords.forEach(System.out::println); // wyswietlenie zawartosci

        String[] uniqueWordsArray = uniqueWords.toArray(new String[uniqueWords.size()]); // konwersja na tablicę
        System.out.println(Arrays.toString(uniqueWordsArray)); // wyswietlenie zawartosci
    }

Wynik: mama, tata, brat bez powtórzeń.

EDIT: Oczywiście jeszcze z pomocą strumienia możesz zrobić żeby każde słowo było z małych liter, żeby się nie powtarzało coś w stylu: dog, Dog

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