» »

Java - sortiranje

Java - sortiranje

rrejc ::

Pozdravljeni,

za sortiranje v C# uporabljam naslednjo kodo:
            var words = new List<string>
                            {
                                "novoknjižen",
                                "njivica",
                                "njegov",
                                "njun",
                                "numirati",
                                "nezadovoljstvo",
                                "nitka"
                            };

            var culture = new CultureInfo("sl-SI");
            words.Sort((s1, s2) => String.Compare(s1, s2, false, culture));

            foreach (string word in words)
            {
                Console.WriteLine(word);
            }

in dobim naslednji izpis:
nezadovoljstvo
nitka
njegov
njivica
njun
novoknjižen
numirati


kar je OK. Besede so lepo sortirane po naši abecedi.

Če naredim isto v Javi:

		List<String> words = new ArrayList<String>();
		words.add("novoknjižen");
		words.add("njivica");
		words.add("njegov");
		words.add("njun");
		words.add("numirati");
		words.add("nezadovoljstvo");
		words.add("nitka");		
		
		Locale locale = new Locale("sl", "SI");
		Collator collator = Collator.getInstance(locale);
		Collections.sort(words,collator);
		
		for (String word : words)
		{
			System.out.println(word);
		}


pa dobim drugačen izpis:

nezadovoljstvo
nitka
novoknjižen
numirati
njegov
njivica
njun


torej besede, ki se začnejo na nj so na koncu (za vsemi ostalimi n-ji). Zakaj je to tako? Je potrebno še kaj nastaviti? Probaval sem različne možnosti z collator.setStrength in collator.setDecomposition ampak ni nič bolje. Kaj mi je storiti - napisati svoj collator?

Edit: verjetno bi šlo z RuleBasedCollator-jem. Čekiram...


Thanks,
Rok
  • spremenilo: rrejc ()

arjan_t ::

napaka

Zgodovina sprememb…

  • spremenil: arjan_t ()

rrejc ::

Ahh, smešno.
Namreč gledal sem v help kjer piše, da je parameter language dvočrkovna oznaka po ISO 639 (torej sl in ne sl_SI). Pol se pa pejd. Hvala arjan_t.

Zgodovina sprememb…

  • spremenilo: rrejc ()

arjan_t ::

pa veš da ni, sl in SI posebaj že vredu

Lahko napišeš:
Locale locale = new Locale("bla");

in bo delalo vredu

če nad oni prvim nardiš:
locale.getDisplayLanguage()

bo vrnilo pravilno vrednost (Slovenian)

rrejc ::

Hmm tegale zadnjega komentarja ne razumem... Anyway, tudi sl_SI (torej Locale locale = new Locale("sl_SI");) ne da pričakovanih rezultatov. Sedaj so vsi šumniki enakovrednim svoji "nešumniški" različici (kombinacija nj je pa v tem primeru OK). Torej koda:

	private static void testSorting() {		
		List<String> words = new ArrayList<String>();
		words.add("čaj");
		words.add("cesta");
		words.add("čikorja");
		words.add("ciza");
		words.add("cunja");
		words.add("čičirika");
		words.add("čežana");		
		words.add("copata");
		words.add("cuker");
		
		Locale locale = new Locale("sl_SI");
		Collator collator = Collator.getInstance(locale);
		Collections.sort(words,collator);
		
		for (String word : words)
		{
			System.out.println(word);
		}
	}
da izpis
čaj
cesta
čežana
čičirika
čikorja
ciza
copata
cuker
cunja


Mogoče kakšen drug predlog kako naj dosežem to, da bodo šumniki urejeni pravilno (črka č je za c-jem, š za s-jem, ž za z-jem) in da bodo špilale tudi kombinacije nj, lj...

Thanks...

jan_g ::

Meni pravilno deluje slovaški :P, slovenski pa ne. Ne vem, zakaj, ko sem to uporabljal že leta nazaj (še pri javi 1.4), je delalo ok. Morda so v naslednjih različicah kaj zasrali ... drugače pa lahko preprosto definiraš pravila z RuleBasedCollatorjem, če noben rezultat ni zadovoljiv.

List<String> words = new ArrayList<String>() {{
            add("čaj");
            add("cesta");
            add("čikorja");
            add("ciza");
            add("cunja");
            add("čičirika");
            add("čežana");        
            add("copata");
            add("cuker"); 
            add("novoknjižen");
            add("njivica");
            add("njegov");
            add("njun");
            add("numirati");
            add("nezadovoljstvo");
            add("nitka");
        }};
        
        Collections.sort(words, Collator.getInstance(new Locale("sk")));
        System.out.println(words);

Spura ::

A znate brat javadoc? usCollator.setStrength(Collator.SECONDARY);

jan_g ::

No, tudi to ne dela za šumnike, odpravi pa problem z 'nj'. Tako da, tvoja rešitev deluje na pol. Meni zaenkrat v 100% deluje samo preklop na slovaški Locale, je pa res, da se mi niti ne da s tem ukvarjati.

Zgodovina sprememb…

  • spremenil: jan_g ()

rrejc ::

Spura, počasi, počasi. Znamo brat javadoc, ki pa kot že rečeno tudi ni sveta knjiga (kot očitno meniš ti). V javadocu namreč piše, da je language: The language argument is a valid ISO Language Code. These codes are the lower-case, two-letter codes as defined by ISO-639. You can find a full list of these codes at a number of sites, such as: http://www.loc.gov/standards/iso639-2/e....

In če bi prebral moje vprašanje bi videl, da sem imel nastavljen locale "sl" (kot ga sveta knjiga javadoc svetuje) in sem probaval z različnimi možnostmi setStrength() ampak nisem dobil zadovoljivega rezultata. Če nastavim local na "sl-SI" pa imam problem z šumniki kot je že pojasnil jan_g.

Jan_g, hvala, bodisi bom probal z slovaškim collatorjem, ali pa z RuleBasedCollatorjem (osnovno sortiranje sem že probal in deluje OK, sedaj moram preveriti še vse ostale posebnosti (posebne znake, naglase...)).


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[Java] Sortiranje razredov

Oddelek: Programiranje
101462 (1209) Spura
»

Sortiranje po večih atributih, java

Oddelek: Programiranje
161698 (1464) marjan_h
»

[JAVA] String problem!

Oddelek: Programiranje
151683 (1380) Sergio
»

Quick sort ascending/descending

Oddelek: Programiranje
162056 (1736) infiniteLoop
»

[JavaScript] Sortiranje šumnikov

Oddelek: Programiranje
152161 (1895) MarkookraM

Več podobnih tem