porównanie stringa

0

Mam pytanie jak w javie mogę wykonać poniższą operację.

String litera="b";

if(litera>="a") //jak wykonać takie porównanie
{
System.out.println("OK");
}
0

Metoda compareTo lub compareToIgnoreCase.

0

A niby co ma oznaczać relacja "większy równy" dla łańcuchach znaków? Można ją zdefiniować na co najmniej kilka sposobów, więc jest w idei swojej niejednoznaczna, wychodzi z tego jakiś absurd.

0

Hmm, tak samo jak relację porządku liniowego można zrealizować na wiele sposobów, można też na wiele sposobów zrealizować relację równoważności. Np relacja "==" mogłaby sprawdzać identyczność pierwszych dwóch znaków :]

0
Wibowit napisał(a)

Hmm, tak samo jak relację porządku liniowego można zrealizować na wiele sposobów, można też na wiele sposobów zrealizować relację równoważności. Np relacja "==" mogłaby sprawdzać identyczność pierwszych dwóch znaków :]

Owszem, tylko taka definicja byłaby maksymalnie c****. Równość łańcuchów znaków jako identyczność każdego znaku jest po prostu intuicyjna i logiczna.
Natomiast co miałaby oznaczać relacja ">="? Zwracać prawdę, gdy lewy argument zawiera w sobie prawy, coś w rodzaju metody startsWith? A może kod (ASCII lub Unicode) każdego znaku lewego argumentu ma być większy równy od kodu odpowiadającego elementu prawego argumentu? Tylko czy w tym przypadku muszą mieć równą długość? Jedno wielkie WTF.

0

@somekind, chyba gadasz od rzeczy. W końcu istnieją spisy alfabetyczne nazwisk, i mam wrażenie, że nie wszystkie nazwiska mają taką samą długość. Java przy porównywaniu Stringów (metoda compareTo) używa porządku leksykograficznego. Przeczytaj definicję.

If two strings are different, then either they have different characters at some index that is a valid index for both strings, or their lengths are different, or both. If they have different characters at one or more index positions, let k be the smallest such index; then the string whose character at position k has the smaller value, as determined by using the < operator, lexicographically precedes the other string.
If there is no index position at which they differ, then the shorter string lexicographically precedes the longer string.

0

Jedno wielkie WTF.
nie jedno wielkie WTF, tylko jeśli ustalimy JAK ma być przeprowadzane to porównywanie, i jeśli będzie ono miało sens, to dlaczego miałbyś nazywać to WTF?

0
bogdans napisał(a)

@somekind, chyba gadasz od rzeczy. W końcu istnieją spisy alfabetyczne nazwisk, i mam wrażenie, że nie wszystkie nazwiska mają taką samą długość. Java przy porównywaniu Stringów (metoda compareTo) używa porządku leksykograficznego.

Porządek leksykograficzny jest oczywisty. Ale polemizowałbym z tym, że jest on tożsamy relacji większości dla łańcuchów znaków, po prostu nigdzie się z taką jej definicją nie spotkałem.

Azarien napisał(a)

nie jedno wielkie WTF, tylko jeśli ustalimy JAK ma być przeprowadzane to porównywanie, i jeśli będzie ono miało sens, to dlaczego miałbyś nazywać to WTF?

WTFem nie będzie, jeśli nasza definicja relacji i operatora >= dla łańcuchów znaków będzie intuicyjna i oczywista, tak jak intuicyjna i oczywista jest dla liczb.

Ja bym jednak prosił o nie rozmydlanie dyskusji. Autor zamieścił kod, do którego fragmentu się odniosłem:

if(litera>="a") //jak wykonać takie porównanie

Ja tylko spytałem (autora konkretnie), co to niby ma być za relacja? Bo dla mnie ten zapis nie jest oczywisty. I pewno nie tylko dla mnie, bo w przeciwnym razie, zapewne taki operator byłby w Javie zdefiniowany. A przecież nie jest.

Aha, jak w Javie posortować tablicę String w porządku alfabetycznym? Próbowałem metodą Arrarys.sort, i zgodnie z moimi przewidywaniami, nie da się.

0

@somekind,

Ale polemizowałbym z tym, że jest on tożsamy relacji większości dla łańcuchów znaków, po prostu nigdzie się z taką jej definicją nie spotkałem.

Czego nie widziałem, to nie istnieje? Ja sie spotkałem, Clipper i Python.

Aha, jak w Javie posortować tablicę String w porządku alfabetycznym? Próbowałem metodą Arrarys.sort, i zgodnie z moimi przewidywaniami, nie da się.

Jest chyba oczywiste, że Arrays.sort sortuje wg porządku domyślnego, tzn. leksykograficznego. Jak chcesz sortować inaczej, to musisz do funkcji sort przekazać dwa argumenty: tablicę do
posortowania i "komparator" = obiekt opisujący kryterium porównywania.

0
bogdans napisał(a)

Czego nie widziałem, to nie istnieje? Ja sie spotkałem, Clipper i Python.

Nie mówię, że nie istnieje. I sama implementacja operatora >= w jakimś języku, to nie jest to samo co definicja relacji większości dla łańcuchów znaków. Moim zdaniem (to opinia, nie fakt), w ich przypadku taka relacja nie ma sensu. Tak samo jak nie miałaby sensu dla ludzi, bo mogłaby dotyczyć zarówno wagi, wzrostu, jak i np. IQ. I która wersja jest słuszna?

Jest chyba oczywiste, że Arrays.sort sortuje wg porządku domyślnego, tzn. leksykograficznego. Jak chcesz sortować inaczej, to musisz do funkcji sort przekazać dwa argumenty: tablicę do posortowania i "komparator" = obiekt opisujący kryterium porównywania.

A czy porządek alfabetyczny nie jest prządkiem leksykograficznym? Z punktu widzenia człowieka jest, to Java (.NET też) mają jakieś niezrozumiałe problemy.

0

somekind

Tak samo jak nie miałaby sensu dla ludzi, bo mogłaby dotyczyć zarówno wagi, wzrostu

Porównanie (moim zdaniem) zupełnie chybione. Wymienione przez Ciebie kryteria porównywania ludzi są sensowne. Jakie masz masz propozycje
kryteriów porónywania Stringów?

A czy porządek alfabetyczny nie jest prządkiem leksykograficznym? Z punktu widzenia człowieka jest, to Java (.NET też) mają jakieś niezrozumiałe problemy.

Problemy są zrozumiałe, wynikają z tego, że uporządkowanie leksykograficzne Stringów powinno dotyczyć ciagów znaków we wszystkich językach naturalnych. Ponadto String nie
ma tabliczki na czole z napisem "jestem słowem po lapońsku", w związku z tym nie wiadomo, które znaki są literami i można je np. zamienić na małe litery.

0
bogdans napisał(a)

Porównanie (moim zdaniem) zupełnie chybione. Wymienione przez Ciebie kryteria porównywania ludzi są sensowne.

Są sensowne przy porównywaniu ich oddzielnie: wzrost ze wzrostem, IQ z IQ, ale nie w przypadku porównywania dwóch ludzi jako takich.

Człowiek c1 = new Człowiek(180, 70, 112);
Człowiek c2 = new Człowiek(170, 120, 96);

Jaki w tym przypadku byłby wynik operacji c1 >= c2?
Ja powiem, że true, bo liczy się wzrost, a ktoś inny powie, że nie, bo waga. Jest to niejednoznaczny zapis, tak jak (moim zdaniem) w przypadku Stringów, i o tę niejednoznaczność cały czas mi chodzi. Kolejność alfabetyczna Stringów jest oczywista, ale już zastosowanie do niej operatora ">=" niekoniecznie.

Jakie masz masz propozycje kryteriów porónywania Stringów?

Nic się nie zmieniło: porównanie stringa

0

Udajesz dzisiaj inteligentnego inaczej?

  1. Dla ludzi są różne logiczne kryteria porównywania, wg wzrostu, wagi, majątku, ... Dlatego nie wiadomo co znaczy operator <= porównujący ludzi. Dla Stringów jest
    takie kryterium.

If two strings are different, then either they have different characters at some index that is a valid index for both strings, or their lengths are different, or both. If they have different characters at one or more index positions, let k be the smallest such index; then the string whose character at position k has the smaller value, as determined by using the < operator, lexicographically precedes the other string.
If there is no index position at which they differ, then the shorter string lexicographically precedes the longer string.

Powyższe kryterium jest powszechnie stosowane w encyklopediach, słownikach, spisach alfabetycznych (z oczywistym i łatwym do realizacji w języku naturalnym nierozróżnianiem wielkości liter).
Link, który zamieściłeś nie prowadzi do żadnej propozycji porównywania. Prowadzi do dziwacznej (moim zdaniem) argumentacji, że nie ma sensownego porównywania.

0
bogdans napisał(a)

Udajesz dzisiaj inteligentnego inaczej?

Nie, po prostu opisuję swoje obserwacje i wyrażam poglądy.

Prowadzi do dziwacznej (moim zdaniem) argumentacji, że nie ma sensownego porównywania.

Nie, że nie ma sensownego, tylko że taki zapis jest niejednoznaczny. Wiem z doświadczenia, że dla ludzi wcale nie jest jasna definicja takiej relacji, jak i taki jej zapis.

Powyższe kryterium jest powszechnie stosowane w encyklopediach, słownikach, spisach alfabetycznych (z oczywistym i łatwym do realizacji w języku naturalnym nierozróżnianiem wielkości liter).

Kryterium opisane w dokumentacji Javy? Wolałbym jakieś obiektywniejsze i starsze źródło definicji relacji ">=" (nie porządku leksykograficznego jako takiego) dla napisów. W końcu encyklopedie istniały zanim powstała Java.

Poza tym, skoro w dokumentacji Javy jest zdefiniowana taka relacja dla stringów, to czemu w takim razie nie zdefiniowano w ten sposób operatora >= w Javie? Nie jest to konsekwentne działanie.

0

Niekonsekwentnych działań w C# jest bazylion. W Javie jak nie było operatorów, tak do dzisiaj nie ma, pomijając oczywiście operacje na (zaboxowanych lub nie) prymitywach. To się nazywa konsekwencja :P Jedyne chyba odstępstwo to dodawanie Stringów i wg mnie to zła decyzja, zwłaszcza biorąc pod uwagę nieintuicyjne traktowanie nulli (String a = null; System.out.println(a + a); daje "nullnull" zamiast, intuicyjnie, wyjątku, bo przecież wywołujemy operator na nullu).

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