我编写了一个比较器,该比较器计算给定字符串中的辅音以比较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);
}
仍然无法正常工作!
编辑=对于这个问题,树集不是正确的数据结构,应使用ArrayList。
答案 0 :(得分:2)
将您的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 进行排序,因此无需计算元音,空格,数字等的数量。此外,也不需要将另一个参数 type 传递给方法count
答案 1 :(得分:1)
您编写的编译器将返回0
(表示相等)
如果2个字符串的辅音数量相同。
您定义了:
TreeSet<String> tree = new TreeSet<String>(new sortByConsonants());
所以在tree
中不能存在2个具有相同辅音数量的项目(字符串)