# Thread: Sort in Cyrilic order

1. Senior Member
Join Date
Apr 2010
Location
Posts
278
Rep Power
7

## 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.

Java 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;
}
}```

2. Moderator
Join Date
Apr 2009
Posts
13,076
Rep Power
23
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.

3. Senior Member
Join Date
Apr 2010
Location
Posts
278
Rep Power
7
Thank you for the suggestion.
I have optimized code:

change that:
Java 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:
Java 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.

4. Senior Member
Join Date
Apr 2010
Location
Posts
278
Rep Power
7
I'll post complete code so it could be more obvious
what I'm writing.

class InsertWords
Java Code:
```import java.util.TreeSet;
import java.util.Iterator;

import java.io.IOException;

public class InsertWords {
TreeSet<String> allWords = new TreeSet<String>();
String currentWord;

public TreeSet<String> insertAllWordsInSet(String fileName)
throws IOException {

String lineOfText = 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++) {
}
}
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:
Из Википедије, слободне енциклопедије

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

Бенгалски тигар (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. Претеран криволов, уништавање станишта итд. довело је тигра на границу опстанка.
[уреди]Подврсте

Постоји осам подврста тигра:
Бенгалски тигар
Индокинески тигар
Суматрански тигар
Сибирски тигар
Јужнокинески тигар
Изумрле подврсте:
Јавански тигар
Каспијски тигар или Персијски тигар
Балијски тигар
[уреди]Спољашње везе
Last edited by cselic; 04-21-2010 at 01:22 PM.

5. Moderator
Join Date
Apr 2009
Posts
13,076
Rep Power
23
Originally Posted by cselic
Java 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.

#### Posting Permissions

• You may not post new threads
• You may not post replies
• You may not post attachments
• You may not edit your posts
•