我有一個帶有欄位 score(int)、name(String) 和 country(String) 的人
1, Jane , Spain
2, James, Italy
1, John , Italy
2, Peter , England
3, Thomas , England
3, Martin , England
現在我提供另一個代表國家名稱的字串串列說: [Italy, Spain, Norway, England, Germany]
我的要求是首先根據分數對 Person 串列進行排序,如果他們具有相同的分數,則按國家名稱串列中提供的國家名稱進行排序。如果國家/地區名稱也匹配,則按人名排序。
所以最后應該按以下順序回傳人員物件:
1, John, Italy
1, Jane, Spain
2, James, Italy
2, Peter, England
3, Martin, England
3, Thomas, England
這是我正在嘗試的代碼:
public static List<Person> sortRecords(List<Person> people, List<String> countries) {
people.sort((p1, p2) -> {
int compare = p1.getScore() - p2.getScore();
if(compare == 0) {
compare = // how to compare by country names based on provided List<String> countries
if(compare == 0) {
compare = p1.getName().compareTo(p2.getName());
}
}
return compare;
});
}
我被困在按國名進行比較。
uj5u.com熱心網友回復:
利用 List.indexOf
public static List<Person> sortRecords(List<Person> people, List<String> countries) {
people.sort((p1, p2) -> {
int compare = p1.getScore() - p2.getScore();
if(compare == 0) {
compare = countries.indexOf(p1.getCountry()) - countries.indexOf(p2.getCountry());
if(compare == 0) {
compare = p1.getName().compareTo(p2.getName());
}
}
return compare;
});
return people;
}
請注意,由于排序是就地完成的,您不需要回傳串列,然后使用 java.util.Comparator您可以做一些好事
public static void sortRecords(List<Person> people, List<String> countries) {
people.sort(
Comparator.comparingInt(Person::getScore)
.thenComparingInt(person -> countries.indexOf(person.getCountry()))
.thenComparing(Person::getName)
);
}
uj5u.com熱心網友回復:
我會使用穩定的排序演算法按名稱、國家和分數對串列進行排序。見https://www.geeksforgeeks.org/stability-in-sorting-algorithms/
import java.util.*;
class Record {
int score; String name; String country;
Record(int s, String n, String c){ score=s; name=n; country=c; }
public String toString(){
return String.format("[%d, %s, %s]", score, name, country);
}
}
public class Main{
public static void main(String[] args) {
Record[] records = {
new Record(1, "Jane" , "Spain"),
new Record(2, "James", "Italy"),
new Record(1, "John" , "Italy"),
new Record(2, "Peter", "England"),
new Record(3, "Thomas", "England"),
new Record(3, "Martin", "England")
};
Comparator<Record> byScore = (r1,r2)->r1.score-r2.score;
Comparator<Record> byCountry = (r1,r2)->r1.country.compareTo(r2.country);
Comparator<Record> byName = (r1,r2)->r1.name.compareTo(r2.name);
System.out.println("===before====");
Arrays.stream(records).forEach(System.out::println);
Arrays.sort(records, byName);
Arrays.sort(records, byCountry);
Arrays.sort(records, byScore);
System.out.println("===after====");
Arrays.stream(records).forEach(System.out::println);
}
}
輸出
===before====
[1, Jane, Spain]
[2, James, Italy]
[1, John, Italy]
[2, Peter, England]
[3, Thomas, England]
[3, Martin, England]
===after====
[1, John, Italy]
[1, Jane, Spain]
[2, Peter, England]
[2, James, Italy]
[3, Martin, England]
[3, Thomas, England]
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/410310.html
標籤:
下一篇:為什么我在此代碼中出現歧義錯誤?
