【问题标题】:Sort a LinkedHashMap with Values and with Time Priority in case of Equal在 Equal 的情况下,使用值和时间优先级对 LinkedHashMap 进行排序
【发布时间】:2014-09-07 05:37:55
【问题描述】:

我知道这个主题可以很好地涵盖,但他们只使用一个仅使用一个值的 Treemap,并且在相同值的情况下不会返回我想要的。

这是我的对象:

public classe myObjectToMap
{
    long id;
    double price;
    String name;
    long date;

    public static void GetMyObject(long id, double price, String name)
    {
        myObjectToMap newObject = new myObjectToMap;
        newObject.id = id;
        newObject.price = price;
        newObject.name = name;
        newObject.date = new Date().getTime();
        PlaceOfMyMap.myMap.put(id, newObject);

    }

这是我的地图所在的位置,我放了一个 LinkedHashMap,但我没有在 Hashmap、TreeMap 和 LinkedHashMap 之间最好,我确实看到 TreeMap 给出了一个 Value 的比较器,但我没有到达要比较的地方一个以上的值。

public class PlaceOfMyMap
{
    public static LinkedHashmap<Long, myObjectToMap> myMap = new LinkedHashmap<~>;
}

最后,这是我的主程序:

public class MainClass
{
    public static void main(String args[]) throws Exception
    {
        MyObjectToHashmap.GetMyObject(1, 26, "Mat")
        MyObjectToHashmap.GetMyObject(4, 25, "Tommy")
        MyObjectToHashmap.GetMyObject(16, 24, "Kate")
        MyObjectToHashmap.GetMyObject(63, 26, "Mary")
        MyObjectToHashmap.GetMyObject(99, 24, "Ronny")

 }

}

首先:我想按时间优先级从最高价格到最低价格对它们进行排序,这意味着我希望 Mat 排在第一位,Kate 排在第二位。

第二:我想按时间优先顺序将它们从最低价格排序到最高价格,这意味着我希望 Kate 排在第一位,Ronny 排在第二位。

有任何正确排序的提示吗?

【问题讨论】:

  • 是的,为您的问题使用不同的结构。如果您想快速访问每个数据,请使用HashMap。如果您需要通过两种方式对它们进行排序,请使用 PriorityQueueComparator,每种排序行为一种。
  • 好的,但我真的不知道 Object PriorityQueue 是如何工作的,我们可以在里面存储任何对象并用密钥再次找到它吗?还是更多列表?

标签: java sorting hashmap treemap linkedhashmap


【解决方案1】:

试试下面的代码。可以逆向compare()方法得到逆向排序

import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

class MyObject
{
    private long id;
    private double price;
    private String name;
    private long date;

    public MyObject(long id, double price, String name) {
    this.id = id;
    this.price = price;
    this.name = name;
    this.date = new Date().getTime();
    }

    @Override
    public String toString() {
        return "MyObject [id=" + id + ", price=" + price + ", name=" + name
                + "]";
    }

    public double getPrice() {
        return price;
    }
    public long getDate() {
        return date;
    }
}

public class MapSort {

    public static void main(String[] args) {
        Map<Long, MyObject> myMap = new LinkedHashMap<Long, MyObject>();

        myMap.put(1L, new MyObject(1, 26, "Mat"));
        myMap.put(4L, new MyObject(4, 25, "Tommy"));
        myMap.put(16L, new MyObject(16, 24, "Kate"));
        myMap.put(63L, new MyObject(63, 26, "Mary"));
        myMap.put(99L, new MyObject(99, 24, "Ronny"));

        System.out.println("Before Sorting");
        System.out.println(myMap);
        System.out.println("\nAfter Sorting");
        System.out.println(sortMap(myMap));
    }

    private static Map<Long, MyObject> sortMap(
            Map<Long, MyObject> unsortedMap) {

        List<Entry<Long, MyObject>> list = new LinkedList<Entry<Long, MyObject>>(unsortedMap.entrySet());

        Collections.sort(list,
                new Comparator<Entry<Long, MyObject>>() {

                    @Override
                    public int compare(Entry<Long, MyObject> o1, Entry<Long, MyObject> o2) {
                        int priceResult = Double.valueOf(o1.getValue().getPrice()).compareTo(Double.valueOf(o2.getValue().getPrice()));
                        if(priceResult != 0) return priceResult;
                        return Long.valueOf(o1.getValue().getDate()).compareTo(Long.valueOf(o2.getValue().getDate()));
                    }
                });

        Map<Long, MyObject> sortedMap = new LinkedHashMap<Long, MyObject>();
        for(Entry<Long, MyObject> item : list){
            sortedMap.put(item.getKey(), item.getValue());
        }
        return sortedMap;
    }
}

输出

Before Sorting
{1=MyObject [id=1, price=26.0, name=Mat], 4=MyObject [id=4, price=25.0, name=Tommy], 16=MyObject [id=16, price=24.0, name=Kate], 63=MyObject [id=63, price=26.0, name=Mary], 99=MyObject [id=99, price=24.0, name=Ronny]}

After Sorting
{16=MyObject [id=16, price=24.0, name=Kate], 99=MyObject [id=99, price=24.0, name=Ronny], 4=MyObject [id=4, price=25.0, name=Tommy], 1=MyObject [id=1, price=26.0, name=Mat], 63=MyObject [id=63, price=26.0, name=Mary]}

【讨论】:

  • 它确实先按价格升序排序,然后再按时间排序。验证系统输出。这对我来说可以。用输出更新答案。
  • Awesom,它似乎工作,我会尝试复制到我的程序!
猜你喜欢
  • 2019-02-17
  • 1970-01-01
  • 2020-03-05
  • 1970-01-01
  • 1970-01-01
  • 2015-04-10
  • 2017-03-13
  • 2021-02-06
  • 2019-03-15
相关资源
最近更新 更多