I_P_W14_M14_Java Uwaga plagiat - porównujemy teksty
Anagram – implementacja w języku Java
Dwa ciągi znaków są anagramem, 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 spacjidrugieZdanie– ł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:
Na początek skupmy się na omówieniu dwóch wykorzystywanych metod: usunSpacje oraz sortujAlfabetycznie. Zaczniemy od analizy pierwszej z nich.
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.
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():
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.
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 anagramem. 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:
Stosując tę metodę, otrzymujemy true, gdy wartości zmiennych pierwszyString i drugiString 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
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
element języka programowania, który zależnie od wyniku sterującego nim wyrażenia logicznego, wykonuje różne instrukcje
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