我有一个LinkedHashMap<String,String>
,它看起来像这样(真的不知道如何说明HashMap):
{
"10/10/2010 10:10:10" => "SomeText1",
"10/10/2019 10:10:19" => "SomeText2",
"10/10/2020 10:10:20" => "SomeText3",
"10/10/2021 10:10:21" => "SomeText4"
}
我想这么说
{
"10/10/2021 10:10:21" => "SomeText4",
"10/10/2020 10:10:20" => "SomeText3",
"10/10/2019 10:10:19" => "SomeText2",
"10/10/2010 10:10:10" => "SomeText1"
}
我已经写了这个解决方案,因为我想要的结果是一个ArrayList,但我在想,如果有一个更简单的方法来逆转LinkedHashMap维护相同的类型,例如使用sort工具。
private LinkedHashMap<String, String> map = new LinkedHashMap<>();
int sizeOfHashMap = map.size();
ArrayList reversedHashToArrayList = new ArrayList(map.size());
for (Map.Entry<String,String> entry : map.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
reversedHashToArrayList.add(0,entry);
}
5条答案
按热度按时间laximzn51#
LinkedHashMap通过插入排序;按关联的日期时间排序会更符合逻辑:
要指定Map是排序的,可以使用SortedMap接口。最好使用一个接口,这样更通用。排序Map的实现类是TreeMap。但是你想要一个反向比较。
您可以使用本地特定模式。请注意,上面我选择了月/日,而不是英国日/月。
fykwrbwg2#
如果你的目的只是为了反转Map(按降序显示),你可以使用**Java.util.TreeMap.descendingMap():**它返回Map中包含的Map的逆序视图`
9ceoxa923#
这是我写的逻辑。而不使用任何内置函数来反转:
u5i3ibmn4#
如果你想继续使用
LinkedHashMap
,在保持效率的同时反转它并不容易。这是一个使用迭代器顺序反转给定LinkedHashMap
的解决方案(这对于LinkedHashMap
是可预测的,因此可能是您正在寻找的)。请注意,使用
SortedMap
或TreeMap
等其他解决方案可能更好。然而,为了坚持你最初的问题,这里有一个解决方案:请注意,遗憾的是,您不会将条目集 Package 到
ArrayList
中,因为这只为您提供了一个ListIterator
,它可以初始化为第一个元素以外的任何点。拥有类似reverseIterator()
的方法可以大大简化生活--遗憾的是没有可用的方法。从复杂性的Angular 来看,使用这种方法可以迭代列表两次,第一次是从开始到最后一个元素的
listIterator
调用,然后在使用previous
时从后面到前面再迭代一次。所以这里的时间复杂度是O(2n)。juud5qan5#
JEP 431: Sequenced Collections在即将到来的Java版本21中添加了一个
reversed()
方法到LinkedHashMap
。这将返回贴图的反转视图。