如何根据自定义订单指南订购对象列表?

问题描述 投票:0回答:2
data class User(
    val name: String,
    val address: Address,
    val group: String
)

data class Address(
    val street: String,
    val city: String
)

我有一个用户列表。我需要按照 Kotlin(或 Java)中的指南按自定义顺序对这个列表进行排序。

  1. 首先由

    group
    订购如下团购。 (不是字母顺序)

    • 数学
    • 科学
    • 英语
    • 底部的其他所有值无顺序
  2. 然后按照以下城市顺序按

    city
    订购。 (排名不分先后)

    • 悉尼
    • 阿德莱德
    • 墨尔本
    • 底部的其他所有值无顺序
  3. 然后按

    street
    逆序排列

  4. 然后按

    name
    按字母顺序排列

如何按照上述指南编写比较器或自定义方法来订购列表? 如果需要,

Address
班级可以进入
User
班级。

java kotlin sorting comparator comparable
2个回答
0
投票

为此,您需要一个比较器,定义两个映射(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)

0
投票

你需要像这样在类 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.