data class User(
val name: String,
val address: Address,
val group: String
)
data class Address(
val street: String,
val city: String
)
我有一个用户列表。我需要按照 Kotlin(或 Java)中的指南按自定义顺序对这个列表进行排序。
首先由
group
订购如下团购。 (不是字母顺序)
然后按照以下城市顺序按
city
订购。 (排名不分先后)
然后按
street
逆序排列
然后按
name
按字母顺序排列
如何按照上述指南编写比较器或自定义方法来订购列表? 如果需要,
Address
班级可以进入 User
班级。
为此,您需要一个比较器,定义两个映射(groupOrder 和 cityOrder),将组和城市的名称映射到它们相应的订单号。
和其他人一样简单地实现 Comperator
val groupOrder = mapOf(
"Maths" to 1,
"Science" to 2,
"English" to 3,
)
val cityOrder = mapOf(
"Sydney" to 1,
"Adelaide" to 2,
"Melbourne" to 3,
)
val customComparator = Comparator<User> { u1, u2 ->
// First, compare by group using the custom order
val groupOrder1 = groupOrder[u1.group] ?: Int.MAX_VALUE
val groupOrder2 = groupOrder[u2.group] ?: Int.MAX_VALUE
if (groupOrder1 != groupOrder2) {
groupOrder1.compareTo(groupOrder2)
} else {
// If groups are the same, compare by city using the custom order
val cityOrder1 = cityOrder[u1.address.city] ?: Int.MAX_VALUE
val cityOrder2 = cityOrder[u2.address.city] ?: Int.MAX_VALUE
if (cityOrder1 != cityOrder2) {
cityOrder1.compareTo(cityOrder2)
} else {
// If cities are the same, compare by street in reverse alphabetical order
u2.address.street.compareTo(u1.address.street)
.takeIf { it != 0 }
?: // If streets are the same, compare by name in alphabetical order
u1.name.compareTo(u2.name)
}
}
}
val userList = listOf(User("kari", Address("M5","Adelaide"), "Maths"),
User("dari", Address("M6","Melbourne"),"English"))
// Usage: sort the list of users using the custom comparator
val sortedList = userList.sortedWith(customComparator)
你需要像这样在类 User 中实现 Comparable
class User
implements Comparable{
String name;
Address address;
String group;
Integer groupRank = Integer.valueOf(7);
Integer addressRank = Integer.valueOf(7);
public User(String name, Address address, String group)
{
this.name = name;
this.address = address;
this.group = group;
if (group.equals("Maths"))groupRank = 1;
if (group.equals("Science"))groupRank = 2;
if (group.equals("English"))groupRank = 3;
// this should be moved into the Address class
if (address.city.equals("Sydney"))addressRank = 1;
if (address.city.equals("Adelaide"))addressRank = 2;
if (address.city.equals("Melbourne"))addressRank = 3;
}
public int compareTo(Object o) {
// do something if o is not User
User other = (User) o;
int groupCompare = this.groupRank.compareTo(other.groupRank);
// Address class should implement Comparable and have its own compreTo
if (groupCompare != 0)return groupCompare;
else return this.addressRank.compareTo(other.addressRank);
}
}
class Address{
String city;
String street;
}