Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按日期对HashMap进行排序_Java_Sorting_Hashmap_Xpages - Fatal编程技术网

Java 按日期对HashMap进行排序

Java 按日期对HashMap进行排序,java,sorting,hashmap,xpages,Java,Sorting,Hashmap,Xpages,在Java类中,我有一个按日期对现有HashMap重新排序的方法。HashMap属于类型,其中对象包含一个名为expPayDate的字段,键字符串是转换为字符串的序列号。。因此,我需要遍历sourceMap中的项目,找到具有最新日期的项目,然后按正确顺序将其复制到tempMap。我的问题是,确定最新日期的项目的最佳方法是什么。您最好的选择是在界面上使用 以下是一个例子: public SortedMap<String, Object> getSortedMap(Map<Stri

在Java类中,我有一个按日期对现有HashMap重新排序的方法。HashMap属于
类型,其中对象包含一个名为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;
}
  • 通过调用Map的
    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,那么这意味着