我有兩個比較器。一個用於按首字母排序的話(在排序僅用於元音字使用)接收比較器類型
public class FirstLetterComparator extends ComparatorType {
@Override
public int compare(String o1, String o2) {
String upperObject1 = o1.toUpperCase();
String upperObject2 = o2.toUpperCase();
return upperObject1.charAt(0) - upperObject2.charAt(0);
}
}
另一個用於通過長度/ vowelsCount COEF(在排序類用於所有字)
public class VowelColComparator extends ComparatorType {
String vowelGroup = "AEIOUaeiou";
@Override
public int compare(String o1, String o2) {
int vCount1 = getVowelCount(o1);
int vCount2 = getVowelCount(o2);
float compareCoef1 = o1.length()/vCount1;
float compareCoef2 = o2.length()/vCount2;
return (int)(compareCoef1 - compareCoef2);
}
public int getVowelCount(String word){
int vowelCount = 0;
for (int i = 0; i < word.length(); i++){
char ch = word.charAt(i);
for (int j = 0; j < vowelGroup.length(); j++){
char v = vowelGroup.charAt(j);
if(ch == v)
vowelCount++;
}
}
return vowelCount;
}
而他們的超類分揀
public class ComparatorType implements Comparator<String> {
@Override
public int compare(String o1, String o2) {
return 0;
}
}
在排序類我有我的排序列表中的兩個類似的方法
public class SortWords {
public static void sortVowelCol(String text, String regex){
Scanner scanner = new Scanner(text);
List<String> words = new ArrayList<>();
System.out.println();
System.out.println("Task1:");
while (scanner.hasNext()){
String word = scanner.next();
if(word.matches(regex)){
words.add(word);
}
}
Collections.sort(words, new VowelColComparator());
int lineCounter = 1;
System.out.println();
System.out.println();
System.out.println("Sorted Words:");
lineCounter = 1;
for(String w : words){
if(lineCounter == 12) {
System.out.print(w + "\n");
lineCounter = 0;
}
else
System.out.print(w + " ");
lineCounter++;
}
}
public static void sortVowelWords(String text, String regex) {
Scanner scanner = new Scanner(text);
List<String> vowelWords = new ArrayList<>();
System.out.println();
System.out.println("Task2: ");
while(scanner.hasNext()){
String word = scanner.next();
if(word.matches(regex)){
vowelWords.add(word);
}
}
Collections.sort(vowelWords, new FirstLetterComparator());
System.out.println();
System.out.println();
System.out.println("Sorted List:");
int lineCounter = 1;
for(String w : vowelWords){
if(lineCounter == 12) {
System.out.print(w + "\n");
lineCounter = 0;
}
else
System.out.print(w + " ");
lineCounter++;
}
}
}
主要類
public class Main {
public static void main(String[] args) {
// write your code here
SingletonText.getInstance().parse();
SingletonText.getInstance().print();
SortWords.sortVowelWords(SingletonText.getInstance().getText().toString(), "^[AEIOUaeiou].*");
SortWords.sortVowelCol(SingletonText.getInstance().getText().toString(), "^[A-Za-z].*");
}
}
的quesuion是如何讓只有一個方法,而不是在SortWords類中的兩個類似的方法?或者如何獲取Collections.sort參數的比較器類型?
傳遞一個int來定義這個方法應該做什麼真的很臭。相反,更好的方法是通過比較器本身。 – Tom
謝謝!幫助了很多 –
另一個有趣的方法是包含可用比較器的枚舉。然後可以將枚舉項傳遞給'sort'方法。缺點是,這將禁止「ComparatorType」的自己/匿名實現。 – Tom