Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.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中具有其他值_Java_Map - Fatal编程技术网

如何在地图中对日期排序<;字符串,字符串>;在java中具有其他值

如何在地图中对日期排序<;字符串,字符串>;在java中具有其他值,java,map,Java,Map,可能重复: 我有一张java地图,上面有map.map contains。我想把这些地图按日期分类。我该怎么做?这是打印后的地图 ------------------------------------- PTRRRRRR 08-20-2011 ------------------------------------- TESTDESC 08-01-2012 ------------------------------------- TESTMYO 12-29-201

可能重复:

我有一张java地图,上面有
map
.map contains
。我想把这些地图按日期分类。我该怎么做?这是打印后的地图

-------------------------------------
PTRRRRRR     08-20-2011
-------------------------------------
TESTDESC     08-01-2012
-------------------------------------
TESTMYO      12-29-2011
-------------------------------------
TESTTEST     08-01-2012
-------------------------------------
TESTPROL     08-01-2012
-------------------------------------
TESTPRO      08-01-2012
-------------------------------------
PNAMELQ      08-02-2012
-------------------------------------
TESTMYO      12-29-2011
------------------------------------

您可以使用这样的自定义比较器

String data = "PTRRRRRR     08-20-2011\n" +
        "TESTDESC     08-01-2012\n" +
        "TESTMYO      12-29-2011\n" +
        "TESTTEST     08-01-2012\n" +
        "TESTPROL     08-01-2012\n" +
        "TESTPRO      08-01-2012\n" +
        "TESTPRO      08-01-2012\n" +
        "PNAMELQ      08-02-2012\n" +
        "TESTMYO      12-29-2011\n";
Map<String, String> map = new LinkedHashMap<String, String>();
for (String line : data.split("\n")) {
    String[] keyValue = line.split(" +");
    map.put(keyValue[0], keyValue[1]);
}
Map.Entry<String, String>[] entries = map.entrySet().toArray(new Map.Entry[map.size()]);
Arrays.sort(entries, new Comparator<Map.Entry<String, String>>() {
    SimpleDateFormat date = new SimpleDateFormat("MM-dd-yyyy");

    @Override
    public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2) {
        try {
            return date.parse(o1.getValue()).compareTo(date.parse(o2.getValue());
        } catch (ParseException e) {
            throw new AssertionError(e);
        }
    }
});
for (Map.Entry entry : entries) {
    System.out.println(entry);
}

您可以使用这样的自定义比较器

String data = "PTRRRRRR     08-20-2011\n" +
        "TESTDESC     08-01-2012\n" +
        "TESTMYO      12-29-2011\n" +
        "TESTTEST     08-01-2012\n" +
        "TESTPROL     08-01-2012\n" +
        "TESTPRO      08-01-2012\n" +
        "TESTPRO      08-01-2012\n" +
        "PNAMELQ      08-02-2012\n" +
        "TESTMYO      12-29-2011\n";
Map<String, String> map = new LinkedHashMap<String, String>();
for (String line : data.split("\n")) {
    String[] keyValue = line.split(" +");
    map.put(keyValue[0], keyValue[1]);
}
Map.Entry<String, String>[] entries = map.entrySet().toArray(new Map.Entry[map.size()]);
Arrays.sort(entries, new Comparator<Map.Entry<String, String>>() {
    SimpleDateFormat date = new SimpleDateFormat("MM-dd-yyyy");

    @Override
    public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2) {
        try {
            return date.parse(o1.getValue()).compareTo(date.parse(o2.getValue());
        } catch (ParseException e) {
            throw new AssertionError(e);
        }
    }
});
for (Map.Entry entry : entries) {
    System.out.println(entry);
}
首先检查并注意,有不同的
Map
实现:

映射的顺序定义为映射集合视图上的迭代器返回其元素的顺序。一些map实现,比如TreeMap类,对它们的顺序做出了特定的保证;其他类,如HashMap类,则没有

在中,您可以找到以下定义:

映射根据其键的自然顺序进行排序,或者由映射创建时提供的比较器进行排序,具体取决于使用的构造函数

由于要按值进行比较(
Map
),因此需要实现一个按值进行比较的
比较器
(这是未测试的):

类ValueComparator实现Comparator{
地图;
公共价值比较(Map){
this.map=map;
}
公共整数比较(字符串a、字符串b){
返回map.get(a).compareTo(map.get(b));
}
}
(您可能希望构建更通用的ValueComparator。)

最后使用

Map<String, Date> sorted = new TreeMap<String, Date>(new ValueComparator(unsortedMap));
sorted.putAll(unsortedMap);
Map sorted=newtreemap(newvaluecomparator(unsortedMap));
已排序的.putAll(未排序的映射);
首先检查并注意,有不同的
Map
实现:

映射的顺序定义为映射集合视图上的迭代器返回其元素的顺序。一些map实现,比如TreeMap类,对它们的顺序做出了特定的保证;其他类,如HashMap类,则没有

在中,您可以找到以下定义:

映射根据其键的自然顺序进行排序,或者由映射创建时提供的比较器进行排序,具体取决于使用的构造函数

由于要按值进行比较(
Map
),因此需要实现一个按值进行比较的
比较器
(这是未测试的):

类ValueComparator实现Comparator{
地图;
公共价值比较(Map){
this.map=map;
}
公共整数比较(字符串a、字符串b){
返回map.get(a).compareTo(map.get(b));
}
}
(您可能希望构建更通用的ValueComparator。)

最后使用

Map<String, Date> sorted = new TreeMap<String, Date>(new ValueComparator(unsortedMap));
sorted.putAll(unsortedMap);
Map sorted=newtreemap(newvaluecomparator(unsortedMap));
已排序的.putAll(未排序的映射);

TESTPRO
多次出现,但键必须是唯一的??它们实际上是
Date
对象还是字符串?该格式的日期字符串不会按照您希望的方式进行排序。请检查此项。@Sajith似乎日期是值,而不是键,因此您的链接将不适用。如果您希望按值排序,则这将非常有用:
TESTPRO
会多次出现,但是键必须是唯一的??它们实际上是
Date
对象还是字符串?这种格式的日期字符串无法按您希望的方式进行排序。请检查此项。@Sajith似乎日期是值,而不是键,因此您的链接将不适用。如果您想按值排序,这将非常有用:使用集合#在地图上排序#入口集将比将数据复制到数组和使用数组#排序更快。回答得好。确实让人欣赏到了
map.OrderBy(x=>DateTime.Parse(x.Value))
的美妙之处!我们将不得不等待Java8。但是它会来……。。@coding.mof它会更快,除非你不能那样做Collections.sort需要一个列表。这一点很好。;)从未意识到。使用集合#在地图上排序#入口集比将数据复制到数组并使用数组#排序更快。回答得好。确实让人欣赏到了
map.OrderBy(x=>DateTime.Parse(x.Value))
的美妙之处!我们将不得不等待Java8。但是它会来……。。@coding.mof它会更快,除非你不能那样做Collections.sort需要一个列表。这一点很好。;)我从未意识到。