我编写了一个比较器,它计算给定字符串中的辅音来比较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);
}
还是行不通!!
编辑=对于这个问题,TreeSet不是正确的数据结构,应该使用ArrayList。
将您的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
你编写它的comperator将返回0
(意思是相等)
如果2个字符串具有相同数量的辅音。
你定义了:
TreeSet<String> tree = new TreeSet<String>(new sortByConsonants());
所以在tree
中不能存在2个具有相同辅音数量的项目(字符串)