Sort in Cyrilic order

• 04-21-2010, 10:36 AM
cselic
Sort in Cyrilic order
Hi. I've written a comparator for cyrilic sort.
Problem is when I try to compare words its happend that for example
words with first letter "J" are before words with first letter "A".
What's wrong with my code?
if there is any other way to sort words in cyrilic order, explain me how it
can be done.

Code:

```import java.util.Comparator; class MyComparator implements Comparator<String> {         private String cyrilic = "АаБбВвГгДдЂђЕеЖжЗзИиЈјКкЛлЉљМмНнЊњОоПпРрСсТтЋћУуФфХхЦцЧчЏџШш";         private static final int NUMBER_OF_CYRILIC_LETTERS = 60;     public int compare(String word1, String word2) {                 String firstWord, secondWord;                 String shorterWord, longerWord;                 int shorterFirstWord = -1;                 firstWord = word1;                 secondWord = word2;                 if(firstWord.length() < secondWord.length()) {                         shorterWord = firstWord;                         longerWord = secondWord;                         shorterFirstWord = -1;                 }                 else {                         shorterWord = secondWord;                         longerWord = firstWord;                         shorterFirstWord = 1;                 }                 if(shorterWord.equals(longerWord.substring(0, shorterWord.length()-1))) {                         return shorterFirstWord;                 }                         for(int i = 0; i < shorterWord.length(); i++) {                                 for(int j = 0; j < NUMBER_OF_CYRILIC_LETTERS; j++) {                                         if((firstWord.charAt(i) == cyrilic.charAt(j)) && (secondWord.charAt(i) != cyrilic.charAt(j)))                                                 return -1;                                         else if ((firstWord.charAt(i) != cyrilic.charAt(j)) && (secondWord.charAt(i) == cyrilic.charAt(j)))                                                 return 1;                                         else return 0;                                 }                         }                 return 0;         }         public boolean equals(Object obj) {                 String rec = (String)obj;                 if(rec.equals(this))                         return true;                 return false;         } }```
• 04-21-2010, 12:04 PM
Tolls
You don't need to loop through the cyrilic list. Just use indexOf(word.charAt(i)). That'll tell you the position, and if that position for the first word is less than the one for the second word then the first word is earlier so you can return -1, else if it's greater then reurn 1, else you keep looping.

All those other charAt's are probably confusing the situation.
• 04-21-2010, 12:39 PM
cselic
Thank you for the suggestion.
I have optimized code:

change that:
Code:

```for(int i = 0; i < shorterWord.length(); i++) {                                 for(int j = 0; j < NUMBER_OF_CYRILIC_LETTERS; j++) {                                         if((firstWord.charAt(i) == cyrilic.charAt(j)) && (secondWord.charAt(i) != cyrilic.charAt(j)))                                                 return -1;                                         else if ((firstWord.charAt(i) != cyrilic.charAt(j)) && (secondWord.charAt(i) == cyrilic.charAt(j)))                                                 return 1;                                         else return 0;                                 }                         }                 return 0;```
with that:
Code:

```for(int i = 0; i < shorterWord.length(); i++)                         if(firstWord.indexOf(cyrilic.charAt(i)) < secondWord.indexOf(cyrilic.charAt(i)))                                 return -1;                         else return 1;```
And result is the same, as before.
• 04-21-2010, 01:17 PM
cselic
I'll post complete code so it could be more obvious
what I'm writing.

class InsertWords
Code:

```import java.util.TreeSet; import java.util.Iterator; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class InsertWords {         TreeSet<String> allWords = new TreeSet<String>();         String currentWord;                 public TreeSet<String> insertAllWordsInSet(String fileName)                 throws IOException {                                 BufferedReader bufferedReader = new BufferedReader(new FileReader(fileName));                 String lineOfText = null;                                         while((lineOfText = bufferedReader.readLine()) != null) {                                 // Regular expression that keeps only cyrilic letters and spaces                                 lineOfText = lineOfText.replaceAll("[^АаБбВвГгДдЂђЕеЖжЗзИиЈјКкЛлЉљМмНнЊњОоПпРрСсТтЋћУуФфХхЦцЧчЏџШш ]", "");                                 String[] allWordsInLine = lineOfText.split(" ");                                 for(int i = 0; i < allWordsInLine.length; i++) {                                         allWords.add(allWordsInLine[i]);                                 }                         }                         bufferedReader.close();                         return allWords;                 }         public void toString(TreeSet<String> wordsInSet) {                 for(String word : wordsInSet)                         System.out.println(word);         }                 public static void main(String[] args) {                 InsertWords words = new InsertWords();                 TreeSet<String> setOfWords = new TreeSet<String>();                 try {                 setOfWords = words.insertAllWordsInSet("myFile.txt");                                 words.toString(setOfWords);                                 System.out.println();                                 }                 catch (IOException izuzetak) {                         System.err.print("File is missing");                 }         } }```
Second class it's already have been posted on the begining of the thread.

myFile.txt contains text:
Quote:

Из Википедије, слободне енциклопедије

За друго значење, погледајте чланак Тигар (вишезначна одредница).
Тигар

Бенгалски тигар (P. tigris tigris)
Систематика
царство: Animalia
тип: Chordata
класа: Mammalia
ред: Carnivora
породица: Felidae
род: Panthera
Биномијална номенклатура
Panthera tigris
(Linnaeus, 1758)
Екологија таксона
Тигар (Panthera tigris) је сисари из породице мачака (Felidae) и један од четири врсте „великих мачака“ рода Panthera. Он је врхунски предатор и највећа жива мачка на свету. Бенгалски тигар је најпознатија подврста и сачињава приближно 80% укупне популације тигрова. Живи у Бангладешу, Бутану, Мјанмару, Непалу и Индији. Као угрожене врсте, већина светских тигрова данас живи у заточеништву.
Садржај [сакриј]
1 Физичке особине
2 Угроженост
3 Подврсте
4 Спољашње везе
[уреди]Физичке особине

Женка тигра, са младунчетом.
Тигрови су најтеже мачке у природи. Иако се свака подврста разликује, генерално, мужјаци тигрова теже између 120 и 250 килограма, а женке између 90 и 150 килограма. Просечно мужјаци су дугачки између 2.4 и 3.2 метара, док су женке између 2.1 и 2.75 метара дугачке. Суматрански тигрови су најмањи од свих тигрова, док су сибирски тигрови највећи.
[уреди]Угроженост

Почетком 19. века постојало је 100.000 тигрова. Данас се тај број значајно променио. У свету живи негде између 5.000 и 7.000 тигрова. Најугроженији је јужнокинески тигар. У свету их има мање од 100. Претеран криволов, уништавање станишта итд. довело је тигра на границу опстанка.
[уреди]Подврсте

Постоји осам подврста тигра:
Бенгалски тигар
Индокинески тигар
Суматрански тигар
Сибирски тигар
Јужнокинески тигар
Изумрле подврсте:
Јавански тигар
Каспијски тигар или Персијски тигар
Балијски тигар
[уреди]Спољашње везе
• 04-21-2010, 02:03 PM
Tolls
Quote:

Originally Posted by cselic
Code:

```for(int i = 0; i < shorterWord.length(); i++)                         if(firstWord.indexOf(cyrilic.charAt(i)) < secondWord.indexOf(cyrilic.charAt(i)))                                 return -1;                         else return 1;```
And result is the same, as before.

You want the char from the word, and the index from the alphabet. You have it back to front. You are getting the char from the alphabet and finding out where in the word it is...which, as you've seen, doesn't work.