Program ma za zadanie sprawdzać czy podane Stringi są anagramami (zbudowane z tych samych liter, np. dupa == ap ud)
Jak zoptymalizować/uprościć/skrócić ten kod? https://pastebin.com/tMHF4dD8 Mógłbym teoretycznie od razu wpisać w listę Character`ów ale wtedy nie mógłbym użyć (chyba) String.trim()
@Bruno_: jak chcesz zoptymalizować to: int[] chars = new int[26]; for (int i = 0; i < slowo1.length(); i++) { chars[slowo1.charAt(i) - 'a')]++; } for (int i = 0; i < slowo1.length(); i++) { chars[slowo2.charAt(i) - 'a')]--; } // tu se jeszcze sprawdz czy w tabliy są same zera i gotowe
@Bruno_: możesz też użyć większej tablicy, jeśli przyjmujesz nie tylko litery, albo hashmapy przy małych stringach twój sposób prawodopodobnie będzie szybszy, ale przy dużych już nie
@Philopolemus_Fronius Anagram – nazwa wywodząca się od słów greckich: ana- (nad) oraz grámma (litera), oznacza wyraz, *wyrażenie lub całe zdanie* powstałe przez przestawienie liter bądź sylab innego wyrazu lub zdania, wykorzystujące wszystkie litery (głoski bądź sylaby) materiału wyjściowego.
@Bruno_: Tak na szybko bo dawno nie pisałem kodu: - skoro sprawdziłeś długość słów i mają taką samą to użyj jednej pętli do przepisywania ich znaków a nie dwóch - a czy w ogóle zamiast przepisywać znak po znaku nie można było skorzystać z String.toChar() ? - no i nie sprawdzasz czy w ogóle są dwa słowa (może być jedno albo wcale)
@YogiYogi: co do drugiej uwagi: nie, ponieważ toChar zwraca tablice obiektów char, a listy nie działają na tych obiektach (prostych się nazywały? nie pamiętam) tylko na Character w tym przypadku chyba że bym jakoś przekonwertował char na Character, ale próbowałem i nie udało się, ponieważ wyskakiwał błąd że nie da się zmienić char[] na Character (czytam troche google i nikt nie napisał jak zmienić na Character[] ( ͡°ʖ̯
@Bruno_: użyj StringBuildera , zreversuj pierwszy string , porównaj z drugim i jeśli są różne to nie jest anagram. new StringBuilder().reverse().toString();
@Bruno_: Dobra, poprawiłem na szybko, nie ma za co (na pewno jeszcze można optymalizować kosztem czytelności, oraz dodaj obsługę błędów i jakieś zaproszenia do wprowadzania danych):
public static void main(String[] args) { Scanner scanner = new Scanner(System.in); char[] slowo1, slowo2;
// usuwam spacje z wprowadzonych słów slowo1 = (scanner.next()).trim().toCharArray(); slowo2 = (scanner.next()).trim().toCharArray();
// jeśli różnią się długością, zakończ program if(slowo1.length != slowo2.length) return;
@YogiYogi: Pytanie czy ten program ma porównywać tylko pojedyncze słowa czy całe zdania bo jeśli zdania to nie zadziała, bo wtedy jak rozumiem różna liczba spacji w porównywanych zdaniach nie powinna mieć znaczenia, a jedynym warunkiem jest użycie tych samych liter w tej samej liczbie.
Anagram [..] oznacza wyraz, wyrażenielub całe zdanie powstałe przez przestawienie liter bądź sylab innego wyrazu lub zdania, wykorzystujące wszystkie litery (głoski bądź sylaby) materiału wyjściowego.
@TomaszWKS: Wiesz, uwagi jak najbardziej słuszne (sam trim jest niewystarczający jeśli wyrazy rozdzielają przecinki albo inne znaki specjalne) ale nie do mnie tylko autora wątku, który tak rozpoczął zadanie :) Tutaj jak rozumiem chodzi mu o pojedyncze słowa bo to jakieś zadanie dla początkujących. Tym niemniej jakieś zabezpieczenia i sprawdzenia należy wprowadzić. Teraz @Bruno_ niech troszkę popracuje z funkcjami na stringach :) a my wskazaliśmy mu drogę.
@eovenn: ale anagram to nie jest palindrom (czyli slowo czytane wspak znaczy to samo co czytane normalnie) @YogiYogi: @TomaszWKS: juz sie biore za jakies poprawki, dam znac czy mi cos wyjdzie
Program ma za zadanie sprawdzać czy podane Stringi są anagramami (zbudowane z tych samych liter, np. dupa == ap ud)
Jak zoptymalizować/uprościć/skrócić ten kod?
https://pastebin.com/tMHF4dD8
Mógłbym teoretycznie od razu wpisać w listę Character`ów ale wtedy nie mógłbym użyć (chyba) String.trim()
W zadaniu tak pisało no xD
int[] chars = new int[26];
for (int i = 0; i < slowo1.length(); i++) {
chars[slowo1.charAt(i) - 'a')]++;
}
for (int i = 0; i < slowo1.length(); i++) {
chars[slowo2.charAt(i) - 'a')]--;
}
// tu se jeszcze sprawdz czy w tabliy są same zera i gotowe
przy małych stringach twój sposób prawodopodobnie będzie szybszy, ale przy dużych już nie
Anagram – nazwa wywodząca się od słów greckich: ana- (nad) oraz grámma (litera), oznacza wyraz, *wyrażenie lub całe zdanie* powstałe przez przestawienie liter bądź sylab innego wyrazu lub zdania, wykorzystujące wszystkie litery (głoski bądź sylaby) materiału wyjściowego.
- skoro sprawdziłeś długość słów i mają taką samą to użyj jednej pętli do przepisywania ich znaków a nie dwóch
- a czy w ogóle zamiast przepisywać znak po znaku nie można było skorzystać z String.toChar() ?
- no i nie sprawdzasz czy w ogóle są dwa słowa (może być jedno albo wcale)
@Bruno_: .trim() usuwa spacje tylko na początku i na końcu łancucha, a nie w środku.
chyba że bym jakoś przekonwertował char na Character, ale próbowałem i nie udało się, ponieważ wyskakiwał błąd że nie da się zmienić char[] na Character (czytam troche google i nikt nie napisał jak zmienić na Character[] ( ͡° ʖ̯
A to nie jest tak że spacje maja wartość null? Oznaczałoby to ze są przy sortowaniu ignorowane
new StringBuilder().reverse().toString();
https://www.tutorialspoint.com/javaexamples/string_reverse.htm
Zamieniasz całą ścieżkę z odwracaniem do jednego kroku.
@Bruno_: Na pewno nie są ignorowane przy porównywaniu długości Stringów
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
char[] slowo1, slowo2;
// usuwam spacje z wprowadzonych słów
slowo1 = (scanner.next()).trim().toCharArray();
slowo2 = (scanner.next()).trim().toCharArray();
// jeśli różnią się długością, zakończ program
if(slowo1.length != slowo2.length)
return;
Arrays.sort(slowo1);
Arrays.sort(slowo2);
// sprawdzam czy są takie same
Tutaj jak rozumiem chodzi mu o pojedyncze słowa bo to jakieś zadanie dla początkujących.
Tym niemniej jakieś zabezpieczenia i sprawdzenia należy wprowadzić.
Teraz @Bruno_ niech troszkę popracuje z funkcjami na stringach :) a my wskazaliśmy mu drogę.
@YogiYogi: @TomaszWKS: juz sie biore za jakies poprawki, dam znac czy mi cos wyjdzie