Comparable比较的重写方法

对于Map中的数据,按照ULStrcture中的util + rutil 进行排序。

1 通用版;用泛型

/* TODO Map的value值升序排序
     * @ param map 待排序的map
     * @ return returnMap 排序后的map
     * (特别说明:若value值降序排序,对应修改compare --> -compare)
     * */
    public <K, V  extends Comparable<? super V>> Map<K, V> sortDescend(Map<K, V> map) {
        List<Map.Entry<K, V>> list = new ArrayList<>(map.entrySet());
        list.sort(new Comparator<Map.Entry<K, V>>() {
            @Override
            public int compare(Map.Entry<K, V> o1, Map.Entry<K, V> o2) {
                int compare = (o1.getValue()).compareTo(o2.getValue());
                return compare;  // return -compare(降序)
            }
        });

        Map<K, V> returnMap = new LinkedHashMap<K, V>();
        for (Map.Entry<K, V> entry : list) {
            returnMap.put(entry.getKey(), entry.getValue());
        }
        return returnMap;
    }

重写compareTo方法

@Override
    public int compareTo(Object o2) {
        return Long.compare((((ULStructure)o2).utilSum() + ((ULStructure)o2).rutilSum()), this.rutilSum() + this.utilSum());
    }

2 自定义数据类型版

 public LinkedHashMap<Integer, ULStructure> sortDescend(LinkedHashMap<Integer, ULStructure> map) {
//    public <K, V extends Comparable<? super V>> Map<K, V> sortDescend(LinkedHashMap<K, V> map) {
        List<Map.Entry<Integer, ULStructure>> list = new ArrayList<>(map.entrySet());
        list.sort(new Comparator<Map.Entry<Integer, ULStructure>>() {
            @Override
            public int compare(Map.Entry<Integer, ULStructure> o1, Map.Entry<Integer, ULStructure> o2) {
                int compare = (o1.getValue()).compareTo(o2.getValue());
                return compare;  // return -compare(降序)
            }
        });

        LinkedHashMap<Integer, ULStructure> returnMap = new LinkedHashMap<Integer, ULStructure>();
        for (Map.Entry<Integer, ULStructure> entry : list) {
            returnMap.put(entry.getKey(), entry.getValue());
        }
        return returnMap;
    }

重写一下compareTo() 方法

 public int compareTo(ULStructure o2){
        return  Long.compare((o2.utilSum()+o2.rutilSum()),this.rutilSum()+this.utilSum());
    }

由于传入的参数不同,所以也会调用不同的compareTo()方法。

另外

定义一个数据类型,可以有不同的实现 (为了配合方法的调用)

Map<Integer, ULStructure> LUs = new LinkedHashMap<>();
### Java TreeSet 实现 Comparable 接口自定义排序规则 为了使 `TreeSet` 能够根据特定属性对自定义对象进行排序,可以通过让该类实现 `Comparable<T>` 接口,并重写其中的 `compareTo(T o)` 方法。下面是一个具体的例子说明如何操作。 #### 定义可比较的对象类 假设有一个表示人的简单类 `Person`,它有两个字段:年龄 (`age`) 和名字 (`name`)。为了让此类能够被 `TreeSet` 正确处理并按某种顺序排列,则需修改此实体使其继承自参数为自身的 `Comparable<Person>` 接口: ```java public class Person implements Comparable<Person> { private int age; private String name; public Person(int age, String name) { this.age = age; this.name = name; } @Override public int compareTo(Person other) { // 首先尝试通过年龄大小来进行升序排序;如果两人同龄则依据姓名字母表先后次序决定前后关系。 return Integer.compare(this.age, other.age); // 如果还需要考虑相同年龄下不同名称之间的排序可以这样写: /* * int result = Integer.compare(this.age, other.age); * if(result == 0){ * result = this.name.compareTo(other.name); * } * return result; */ } @Override public String toString() { return "Person{" + "age=" + age + ", name='" + name + '\'' + '}'; } } ``` 上述代码实现了基于成员变量 `age` 的自然排序逻辑[^1]。 #### 创建并填充有序集合 一旦完成了上面的工作之后就可以创建一个不带显式指定比较器的新实例了——因为此时我们的 `Person` 类已经有了默认的行为方式。接着向里面添加几个新元素看看会发生什么变化吧! ```java import java.util.TreeSet; // ... Set<Person> personSet = new TreeSet<>(); personSet.add(new Person(15, "zhangsan")); personSet.add(new Person(12, "lisi")); personSet.add(new Person(17, "wangwu")); for (Person person : personSet) { System.out.println(person); } ``` 这段程序将会按照之前设定好的规则自动调整内部结构从而保证每次迭代访问时都能获得已排好序列的结果集[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值