Wróć do informacji o e-podręczniku Wydrukuj Pobierz materiał do PDF Pobierz materiał do EPUB Pobierz materiał do MOBI Zaloguj się, aby dodać do ulubionych Zaloguj się, aby skopiować i edytować materiał Zaloguj się, aby udostępnić materiał Zaloguj się, aby dodać całą stronę do teczki

Anagram – implementacja w języku Java

Dwa ciągi znaków są anagramemanagramanagramem, jeśli przestawiając litery w jednym z nich, jesteśmy w stanie utworzyć drugi. Napiszmy program sprawdzający, czy łańcuchy znaków są anagramami, zgodnie z następującą specyfikacją:

Specyfikacja problemu:

Dane:

  • pierwszeZdanie – łańcuch znaków składający się z małych liter i znaków spacji

  • drugieZdanie – łańcuch znaków składający się z małych liter i znaków spacji

Wynik:

Program wypisuje: „Zdania są anagramem”, jeśli dane ciągi znaków są anagramem, lub „Zdania nie są anagramem”, jeśli dane ciągi znaków nie są anagramem.

Przeanalizujmy napisany w języku Java program, którego zadaniem jest sprawdzenie, czy dwa podane ciągi znaków są swoimi anagramami:

Linia 1. import java kropka util kropka Arrays średnik. Linia 3. public class Main otwórz nawias klamrowy. Linia 5. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy. Linia 6. String pierwszeZdanie znak równości usunSpacje otwórz nawias okrągły cudzysłów pestka cudzysłów zamknij nawias okrągły średnik. Linia 7. String drugieZdanie znak równości usunSpacje otwórz nawias okrągły cudzysłów aspekt cudzysłów zamknij nawias okrągły średnik. Linia 9. if otwórz nawias okrągły pierwszeZdanie kropka length otwórz nawias okrągły zamknij nawias okrągły wykrzyknik znak równości drugieZdanie kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 10. System kropka out kropka println otwórz nawias okrągły cudzysłów Zdania nie są anagramem cudzysłów zamknij nawias okrągły średnik. Linia 11. return średnik. Linia 12. zamknij nawias klamrowy. Linia 14. if otwórz nawias okrągły sortujAlfabetycznie otwórz nawias okrągły pierwszeZdanie zamknij nawias okrągły kropka equals otwórz nawias okrągły sortujAlfabetycznie otwórz nawias okrągły drugieZdanie zamknij nawias okrągły zamknij nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 15. System kropka out kropka println otwórz nawias okrągły cudzysłów Zdania są anagramem cudzysłów zamknij nawias okrągły średnik. Linia 16. zamknij nawias klamrowy else otwórz nawias klamrowy. Linia 17. System kropka out kropka println otwórz nawias okrągły cudzysłów Zdania nie są anagramem cudzysłów zamknij nawias okrągły średnik. Linia 18. zamknij nawias klamrowy. Linia 19. zamknij nawias klamrowy. Linia 21. public static String usunSpacje otwórz nawias okrągły String wyraz zamknij nawias okrągły otwórz nawias klamrowy. Linia 22. return wyraz kropka replaceAll otwórz nawias okrągły cudzysłów lewy ukośnik lewy ukośnik s plus cudzysłów przecinek cudzysłów cudzysłów zamknij nawias okrągły średnik. Linia 23. zamknij nawias klamrowy. Linia 25. public static String sortujAlfabetycznie otwórz nawias okrągły String wyraz zamknij nawias okrągły otwórz nawias klamrowy. Linia 26. char otwórz nawias kwadratowy zamknij nawias kwadratowy tablicaChar znak równości wyraz kropka toCharArray otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 27. Arrays kropka sort otwórz nawias okrągły tablicaChar zamknij nawias okrągły średnik. Linia 28. return String kropka valueOf otwórz nawias okrągły tablicaChar zamknij nawias okrągły średnik. Linia 29. zamknij nawias klamrowy. Linia 30. zamknij nawias klamrowy.

Na początek skupmy się na omówieniu dwóch wykorzystywanych metod: usunSpacje oraz sortujAlfabetycznie. Zaczniemy od analizy pierwszej z nich.

Linia 1. public static String usunSpacje otwórz nawias okrągły String wyraz zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. return wyraz kropka replaceAll otwórz nawias okrągły cudzysłów lewy ukośnik lewy ukośnik s plus cudzysłów przecinek cudzysłów cudzysłów zamknij nawias okrągły średnik. Linia 3. zamknij nawias klamrowy.

Zakładamy, że nasz program będzie w stanie sprawdzać nie tylko pary ciągów znaków będące pojedynczymi wyrazami, ale i całe zdania. W takiej sytuacji problematyczne może być występowanie znaków odstępu pomiędzy kolejnymi słowami w zdaniu. Pomocne będzie pozbycie się spacji. Prosta metoda realizuje to zadanie poprzez wykorzystanie innej, zawartej we wbudowanej klasie String metody replaceAll. Jej działanie polega na zamianie każdego wystąpienia w ciągu wybranego znaku innym, również wskazanym przez nas znakiem. W tym wypadku zamieniamy znaki odstępu określone jako \\s+ brakiem znaku.

Ważne!

Wyrażeniem reprezentującym pojedynczy znak odstępu jest \s. Dodanie do niego symbolu + (będącego tzw. kwantyfikatorem zachłannym) sprawia, że uwzględniamy nie tylko pojedyncze, ale i wielokrotne wystąpienie podanego znaku. Ponieważ symbol \ jest w języku Java zarezerwowany do poprzedzania znaków specjalnych, użycie go w ciągu znaków wymaga wykorzystania kolejnego znaku \. Innymi słowy, aby uzyskać znak \ w ciągu znaków, należy użyć go podwójnie \\.

Przejdźmy teraz do analizy funkcji sortujAlfabetycznie():

Linia 1. public static String sortujAlfabetycznie otwórz nawias okrągły String wyraz zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. char otwórz nawias kwadratowy zamknij nawias kwadratowy tablicaChar znak równości wyraz kropka toCharArray otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 3. Arrays kropka sort otwórz nawias okrągły tablicaChar zamknij nawias okrągły średnik. Linia 4. return String kropka valueOf otwórz nawias okrągły tablicaChar zamknij nawias okrągły średnik. Linia 5. zamknij nawias klamrowy.

Wewnątrz funkcji wykorzystaliśmy gotową funkcję sortowania niemalejącego tablic – Arrays.sort(). Aby móc jej użyć, niezbędne jest zaimportowanie klasy java.util.Arrays. Ponieważ funkcja jako argument przyjmuje tablicę, musimy zamienić obiekt typu String na tablicę znakową typu char. Możemy wykorzystać w tym celu metodę toCharArray() dostępną w klasie String. Kolejnym krokiem będzie wywołanie funkcji Arrays.sort(). Jako argument podajemy uzyskaną wcześniej tablicę znakową. Użycie funkcji spowoduje posortowanie podanej jako argument tablicy w kolejności niemalejącej, czyli w przypadku znaków — alfabetycznej. Ponieważ utworzona przez nas funkcja jest typu String, musimy w tym momencie zamienić tablicę znaków z powrotem na typ String. Wykorzystujemy w tym celu metodę String.valueOf(), która jako argument przyjmuje tablicę znaków typu char. Funkcja ta zwraca obiekt typu String powstały z podanej tablicy.

W tym momencie możemy przejść do analizy funkcji głównej programu.

Linia 1. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. String pierwszeZdanie znak równości usunSpacje otwórz nawias okrągły cudzysłów pestka cudzysłów zamknij nawias okrągły średnik. Linia 3. String drugieZdanie znak równości usunSpacje otwórz nawias okrągły cudzysłów aspekt cudzysłów zamknij nawias okrągły średnik. Linia 5. if otwórz nawias okrągły pierwszeZdanie kropka length otwórz nawias okrągły zamknij nawias okrągły wykrzyknik znak równości drugieZdanie kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 6. System kropka out kropka println otwórz nawias okrągły cudzysłów Zdania nie są anagramem cudzysłów zamknij nawias okrągły średnik. Linia 7. return średnik. Linia 8. zamknij nawias klamrowy. Linia 10. if otwórz nawias okrągły sortujAlfabetycznie otwórz nawias okrągły pierwszeZdanie zamknij nawias okrągły kropka equals otwórz nawias okrągły sortujAlfabetycznie otwórz nawias okrągły drugieZdanie zamknij nawias okrągły zamknij nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 11. System kropka out kropka println otwórz nawias okrągły cudzysłów Zdania są anagramem cudzysłów zamknij nawias okrągły średnik. Linia 12. zamknij nawias klamrowy else otwórz nawias klamrowy. Linia 13. System kropka out kropka println otwórz nawias okrągły cudzysłów Zdania nie są anagramem cudzysłów zamknij nawias okrągły średnik. Linia 14. zamknij nawias klamrowy. Linia 15. zamknij nawias klamrowy.

W pierwszej kolejności usuwamy znaki spacji z danych wejściowych – po to, by umożliwić sprawdzanie zdań. Jeżeli zostaną podane tylko pojedyncze wyrazy, żaden znak spacji nie zostanie usunięty.

Następnie sprawdzamy, czy długość naszych danych jest jednakowa. Jeżeli nie, program kończy działanie, ponieważ para ta nie jest anagramemanagramanagramem. Jeśli długości są identyczne, kontynuujemy działanie programu i sprawdzamy, czy po posortowaniu alfabetycznym ciągi znaków są takie same.

Do tego celu nie używa się jednak operatora porównania ==, ponieważ w języku Java wartości zmiennych typu String porównujemy poprzez:

Linia 1. pierwszyString kropka equals otwórz nawias okrągły drugiString zamknij nawias okrągły.

Stosując tę metodę, otrzymujemy true, gdy wartości zmiennych pierwszyStringdrugiString są sobie równe, w przeciwieństwie do operatora ==, który zwraca true, gdy obie zmienne są tym samym obiektem. Tajniki programowania obiektowego poznasz niedługo – teraz zapamiętaj, że do porównania wartości zmiennych typu String używamy właśnie tej metody.

Jeżeli wartości zmiennych są takie same, oznacza to, że wyrazy są anagramami. W przeciwnym wypadku nie są anagramami.

Słownik

anagram
anagram

wyraz, wyrażenie lub całe zdanie powstałe przez przestawienie liter bądź sylab innego wyrazu lub zdania, wykorzystując wszystkie jego litery dokładnie raz

instrukcja warunkowa
instrukcja warunkowa

element języka programowania, który zależnie od wyniku sterującego nim wyrażenia logicznego, wykonuje różne instrukcje

kod ASCII
kod ASCII

siedmiobitowy system kodowania znaków; przyporządkowuje liczbom z zakresu 0−127: litery alfabetu łacińskiego języka angielskiego, cyfry, znaki przestankowe i inne symbole oraz polecenia sterujące