Почему использование собственного компаратора для treeSet нарушает равенство объектов String? - PullRequest
0 голосов
/ 31 января 2019

Я написал компаратор, который вычисляет согласные в заданной строке для сравнения 2 строк, но это как-то заставляет TreeSet думать, что 2 строки равны (может быть, когда они имеют одинаковый размер).

public class SortDiff {
public static void main(String[] s1) {

    List<String> list = Arrays.asList("century", "army", "spit", "twin", "frog", "guideline", "impulse",
            "distributor", "hallway", "appeal", "fitness", "pudding", "mild", "enter", "kitchen", "constitutional",
            "die", "condition", "morsel", "jealous", "colorful", "myth", "belly", "rugby", "valid", "shot",
            "locate", "preference", "representative", "chart", "prince", "think", "threshold", "health", "sweater",
            "volume", "poison", "lease", "toast", "diplomat", "trait", "cower", "slime", "handy", "example",
            "sanctuary", "board", "crash", "large", "attract", "censorship", "room", "license", "smoke", "roll",
            "taste", "inflate", "continuation", "establish", "fault", "gown", "dirty", "width", "qualify",
            "reference", "excitement", "vegetable", "wear", "confusion", "concept", "willpower", "snarl", "develop",
            "integration", "pie", "respectable", "fast", "limit", "shaft", "acceptance", "insert", "brown", "death",
            "effective", "ticket", "play", "highway", "lot", "tablet", "mother", "pier", "facility", "match",
            "animal", "sport", "laundry", "negligence", "white", "vat", "nuclear");
    System.out.println(list.size() + "=====");
    TreeSet<String> tree = new TreeSet<String>(new sortByConsonants());//
    int count = 0;
    for (String s : list) {
        count++;
        System.out.println(s);
        System.out.println(tree.add(s));
    }
    System.out.println("===>" + count);
    System.out.println(tree.size() + "=====");
    Iterator itr = tree.iterator();
    while (itr.hasNext()) {
        System.out.println(itr.next());
    }
}


}

Это класс компаратора, который я передаю TreeSet.

class sortByConsonants implements Comparator<String>{

    public int compare(String a, String b) 
    { 

        return count(a,2)-count(b,2);
    } 
    public boolean equals(String a,String b) {

        return a.equals(b);

    }

    public int count(String line,int type) {
        int vowels = 0, consonants = 0, digits = 0, spaces = 0;

        line = line.toLowerCase();
        for(int i = 0; i < line.length(); ++i)
        {
            char ch = line.charAt(i);
            if(ch == 'a' || ch == 'e' || ch == 'i'
                || ch == 'o' || ch == 'u') {
                ++vowels;
            }
            else if((ch >= 'a'&& ch <= 'z')) {
                ++consonants;
            }
            else if( ch >= '0' && ch <= '9')
            {
                ++digits;
            }
            else if (ch ==' ')
            {
                ++spaces;
            }
        }

        if(type==1) {
            return vowels;
        }else {
            return consonants;
        }

    }

}

Может кто-нибудь, пожалуйста, посмотрите на него и найдите ошибку, которую я делаю !!

Цель: Я хочусортировка строк по количеству согласных (без использования библиотечного метода sort ())

Редактировать: изменена логика компаратора на

public int compare(String a, String b) 
    { 
        if(count(a,2)-count(b,2)==0) {
            return 1;
        }
        return count(a,2)-count(b,2);
    } 

Все еще не работает !!

Edit = Для этого вопроса TreeSet не является правильной структурой данных, следует использовать ArrayList.

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Ваш компаратор, как вы его закодировали, вернет 0 (имеется в виду равенство)если 2 строки имеют одинаковое количество согласных .Вы определили:

TreeSet<String> tree = new TreeSet<String>(new sortByConsonants());

, поэтому в tree не может существовать 2 элемента (строки) с одинаковым количеством согласных

0 голосов
/ 31 января 2019

Измените SortByConsonants на следующее. (обратите внимание, что имена классов должны начинаться с заглавной буквы)

class SortByConsonants implements Comparator<String> {

    public int compare(String a, String b) {
        if (count(a) - count(b) == 0) {
            return 1;
        }
        return count(a) - count(b);
    }

    public boolean equals(String a, String b) {
        return a.equals(b);
    }

    public int count(String line) {
        int consonants = 0;
        line = line.toLowerCase();
        for (int i = 0; i < line.length(); ++i) {
            char ch = line.charAt(i);
            if (ch != 'a' && ch != 'e' && ch != 'i' && ch != 'o' && ch != 'u') {
                consonants++;
            }
        }
        return consonants;
    }

}

Кроме того, поскольку нам просто интересно отсортировать на основе счетчика согласных, существуетнет необходимости вычислять количество гласных, пробелов, цифр и т. д. Кроме того, нет необходимости передавать другой параметр type в метод count

...