Java 使用值和时间优先级对LinkedHashMap排序(如果相等)
我知道这个主题可以很好地涵盖,但他们只使用一个只使用一个值的树形图,并且在相同值的情况下不会返回我想要的 这是我的目标:Java 使用值和时间优先级对LinkedHashMap排序(如果相等),java,sorting,hashmap,treemap,linkedhashmap,Java,Sorting,Hashmap,Treemap,Linkedhashmap,我知道这个主题可以很好地涵盖,但他们只使用一个只使用一个值的树形图,并且在相同值的情况下不会返回我想要的 这是我的目标: public classe myObjectToMap { long id; double price; String name; long date; public static void GetMyObject(long id, double price, String name) { myObjectTo
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给出了一个值的比较器,但我并不是为了与多个值进行比较
public class PlaceOfMyMap
{
public static LinkedHashmap<Long, myObjectToMap> myMap = new LinkedHashmap<~>;
}
}
第一:我想按时间优先顺序从最高价格到最低价格进行排序,这意味着我希望Mat是第一位,Kate是第二位
第二:我想把它们从最低的价格到最高的价格进行排序,时间优先,这意味着我希望凯特是第一位,罗尼是第二位
有没有正确分类的建议 试试下面的代码。您可以反转
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;
}
}
是的,针对您的问题使用不同的结构。如果希望快速访问每个数据,请使用
HashMap
。如果需要按两种方式对它们进行排序,请使用PriorityQueue
和Comparator
,每个排序行为一个。好的,但我不知道Object PriorityQueue是如何工作的,我们可以将任何对象存储在其中,然后用键再次找到它吗?或者它是一个更大的列表?它确实按照价格的升序排序,然后是时间。验证系统输出。这对我来说很好。用输出更新答案。阿维索姆,它似乎工作,我将尝试复制到我的程序!
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]}