代码之家  ›  专栏  ›  技术社区  ›  Rishi Prakash

为什么使用自定义比较器进行树集设置会破坏字符串对象的相等性?

  •  2
  • Rishi Prakash  · 技术社区  · 6 年前

    我已经写了一个比较器,它计算给定字符串中的辅音来比较两个字符串,但它不知何故使TreeSet认为两个字符串相等(可能是当它们大小相同时)。

    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的comparator类。

    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=对于此问题,树集的数据结构不正确,应使用ArrayList。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Nicholas K    6 年前

    换衣服 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;
        }
    
    }
    

    另外,因为我们只想根据 计数 类型 方法 count

        2
  •  1
  •   forpas    6 年前

    你的竞争对手会回来的 0 (意思是平等)
    相同数量的辅音
    您定义了:

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

    所以在 tree 不能存在两个辅音数相同的项目(字符串)