Java 按日期对HashMap进行排序
在Java类中,我有一个按日期对现有HashMap重新排序的方法。HashMap属于Java 按日期对HashMap进行排序,java,sorting,hashmap,xpages,Java,Sorting,Hashmap,Xpages,在Java类中,我有一个按日期对现有HashMap重新排序的方法。HashMap属于类型,其中对象包含一个名为expPayDate的字段,键字符串是转换为字符串的序列号。。因此,我需要遍历sourceMap中的项目,找到具有最新日期的项目,然后按正确顺序将其复制到tempMap。我的问题是,确定最新日期的项目的最佳方法是什么。您最好的选择是在界面上使用 以下是一个例子: public SortedMap<String, Object> getSortedMap(Map<Stri
类型,其中对象包含一个名为expPayDate的字段,键字符串是转换为字符串的序列号。。因此,我需要遍历sourceMap中的项目,找到具有最新日期的项目,然后按正确顺序将其复制到tempMap。我的问题是,确定最新日期的项目的最佳方法是什么。您最好的选择是在界面上使用
以下是一个例子:
public SortedMap<String, Object> getSortedMap(Map<String, Object> originalMap) {
SortedMap<String, Object> tmpMap = new TreeMap<String, Object>(new Comparator<String>(){
@Override
public int compare(String key1, String key2) {
//logic for comparing dates
}
});
tmpMap.putAll(originalMap);
return tmpMap;
}
public SortedMap getSortedMap(地图原始地图){
SortedMap tmpMap=新树映射(新比较器(){
@凌驾
公共整数比较(字符串键1、字符串键2){
//比较日期的逻辑
}
});
tmpMap.putAll(原始地图);
返回tmpMap;
}
entrySet()
方法获取所有条目比较器
,根据值对条目进行排序条目
设置为列表
Collections.Sort()
方法对条目列表进行排序,方法是传递值比较器LinkedHashMap
请看示例代码@为简单起见,我假设您的映射类型更像
map-map
,其中MyClass
具有类似getDate()
的方法,该方法返回expPayDate
我的问题是什么是确定最新日期商品的最佳方式
如果您想找到单个映射条目,其中的值包含max date,那么您不需要对整个映射进行排序,最多只能得到O(n*logn)。您需要的是对map中的所有元素进行简单的迭代,并将它们与当前max进行比较,这将是O(n)操作
您可以使用stream()
(Java 8中添加的功能)及其max
方法。此方法需要比较器
,您可以通过使用比较
方法并传递lambda表达式轻松创建一个比较器,lambda表达式将返回比较时应使用的值
所以你的代码看起来像
//import java.util.Map.Entry;
Optional<Entry<String, MyClass>> max = map.entrySet().stream()
.max(Comparator.comparing(e -> e.getValue().getDate()));
Entry<String, MyClass> entry = max.get();
MyClass maxMC = entry.getValue();
//导入java.util.Map.Entry;
可选max=map.entrySet().stream()
.max(Comparator.comparing(e->e.getValue().getDate());
Entry=max.get();
MyClass maxMC=entry.getValue();
如果您不能使用Java8,您可以编写自己的方法来迭代元素并找到max
public static <T> T max(Iterable<T> iterable, Comparator<T> comp) {
Iterator<T> it = iterable.iterator();
T max = null;
if (it.hasNext()) {
max = it.next();
}
while (it.hasNext()) {
T tmp = it.next();
if (comp.compare(max, tmp) < 0)
max = tmp;
}
return max;
}
publicstatictmax(Iterable Iterable,Comparator comp){
Iterator it=iterable.Iterator();
T max=null;
if(it.hasNext()){
max=it.next();
}
while(it.hasNext()){
T tmp=it.next();
如果(组件比较(最大值,tmp)<0)
max=tmp;
}
返回最大值;
}
你可以像这样使用它
Comparator<Entry<String, MyClass>> myComparator = new Comparator<Entry<String, MyClass>>() {
@Override
public int compare(Entry<String, MyClass> o1, Entry<String, MyClass> o2) {
return o1.getValue().getDate().compareTo(o2.getValue().getDate());
}
};
Entry<String, MyClass> maxEntry = max(map.entrySet(), myComparator);
MyClass max = maxEntry.getValue();
Comparator myComparator=newcomparator(){
@凌驾
公共整数比较(条目o1、条目o2){
返回o1.getValue().getDate().compareTo(o2.getValue().getDate());
}
};
Entry maxEntry=max(map.entrySet(),myComparator);
MyClass max=maxEntry.getValue();
使用树映射而不是HashMap。它将在插入时自动排序
Map< Date, Object> m = new TreeMap< Date, Object>();
Mapm=newtreemap();
或者,如果您有一个现有的HashMap并希望基于它创建一个树映射,请将其传递给构造函数:
Map< Date, Object> sortedMap = new TreeMap< Date, Object>(m);
MapsortedMap=newtreemap(m);
希望它能对您有所帮助。如果您只需要最短或最长日期,为每个循环提供一个简单的循环就足够了:
Date maxDate = null;
for (Entry<String, Object> item: hashMap.entrySet())
if (maxDate == null || maxDate before((Date)item.getValue()))
maxDate = (Date)item.getValue();
datemaxdate=null;
for(条目项:hashMap.entrySet())
如果(maxDate==null | | maxDate早于((Date)item.getValue())
maxDate=(日期)item.getValue();
这种方式的复杂性只有O(n),插入和删除操作比使用
sortedMap
便宜。无论如何,我认为patstuart的建议(使用a)更为优雅。正确的解决方案取决于您的性能限制
如果您的问题只是查找具有最新日期的项,那么如果O(n)性能正常,您可以扫描HashMap中的值(),并以这种方式找到最小值
这取决于相对于数据结构上的其他访问,您需要执行此操作的频率。根据您对该数据结构的访问模式,使用SortedMap或使用PriorityQueue(在日期充当堆)等辅助数据结构是完全合理的 HashMaps没有顺序,您应该查看已排序的映射。您的泛型类型真的是
对象吗
,或者我们可以假设它是类似于MyClass
?我这样问是因为对象
的接口方法中没有允许我们获取expPayDate
,而MyClass
可能包含类似getExpPayDate()
的内容。坚持使用非Java 8解决方案,因为我们还不能使用Java 6以外的任何东西。对我来说,将地图重新定义为树形图或使用比较器最有意义。如果你有一个列表形式的项目集合,我想知道列表是否更适合你的需要。根据你想做的事情,你可能希望回顾一下你想做的事情。对于使用带有列表的比较器,OP的问题是关于一个JEE实现,具体是1.6(目前)。XPages运行时还不能从任何Java8实现中获益。我回顾了我的否决票,因为这对于非XPages开发人员来说并不明显,而且对于平台来说是独特的,但我相信这提供了一些关于所有Java实现的合理优点,并强调了运行时更新到更高Java版本的需要。很好的输入,但@Bill将无法使用它。@EricMcCormick如果问题只存在于Java8,那么这意味着