Results 1 to 5 of 5
  1. #1
    cselic is offline Senior Member
    Join Date
    Apr 2010
    Location
    Belgrade, Serbia
    Posts
    278
    Rep Power
    5

    Default 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, already exist comparator for cyrilic sort, please tell me about it, or
    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. #2
    Tolls is offline Moderator
    Join Date
    Apr 2009
    Posts
    11,755
    Rep Power
    19

    Default

    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. #3
    cselic is offline Senior Member
    Join Date
    Apr 2010
    Location
    Belgrade, Serbia
    Posts
    278
    Rep Power
    5

    Default

    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. #4
    cselic is offline Senior Member
    Join Date
    Apr 2010
    Location
    Belgrade, Serbia
    Posts
    278
    Rep Power
    5

    Default

    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.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:
    Из Википедије, слободне енциклопедије

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

    Бенгалски тигар (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. #5
    Tolls is offline Moderator
    Join Date
    Apr 2009
    Posts
    11,755
    Rep Power
    19

    Default

    Quote Originally Posted by cselic View Post
    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.

Similar Threads

  1. How to order a vector?
    By tyang in forum New To Java
    Replies: 2
    Last Post: 02-06-2010, 08:24 AM
  2. Using Merge Sort to sort an ArrayList of Strings
    By coldfire in forum New To Java
    Replies: 3
    Last Post: 03-13-2009, 01:03 AM
  3. How to sort array objects into alphabetical order...
    By lisalala in forum New To Java
    Replies: 5
    Last Post: 03-03-2009, 11:01 AM
  4. Descending order
    By santanu in forum New To Java
    Replies: 1
    Last Post: 11-04-2008, 04:33 PM
  5. How to sort a list using Bubble sort algorithm
    By Java Tip in forum Algorithms
    Replies: 3
    Last Post: 04-29-2008, 08:04 PM

Posting Permissions

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