LinkedHashMap 到 LinkedHashMap 或 ArrayList 的逆序
Reverse order of LinkedHashMap to LinkedHashMap or ArrayList
我有一个 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,但我在想是否有更简单的方法来使用像 sort[ 这样的工具来反转保持相同类型的 LinkedHashMap 例如。
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);
}
这是我自己写给你的逻辑。不使用任何内置函数来反转:
LinkedHashMap<String, String> map = new LinkedHashMap<>();
map.put("10/10/2010 10:10:10", "SomeText1");
map.put("10/10/2019 10:10:19", "SomeText2");
map.put("10/10/2020 10:10:20", "SomeText3");
map.put("10/10/2021 10:10:21", "SomeText4");
LinkedHashMap<String, String> reversed = new LinkedHashMap<>();
String[] keys = map.keySet().toArray(new String[map.size()]);
for (int i = keys.length - 1; i >= 0; i--) {
reversed.put(keys[i], map.get(keys[i]));
}
一个LinkedHashMap按插入排序;按关联的日期时间排序更合乎逻辑:
private SortedMap<LocalDateTime, String> map = new TreeMap<>(Comparator.naturalOrder()
.reversed());
LocalDateTimeFormatter formatter = LocalDateTimeFormatter.ofPattern("MM/dd/uuuu HH:mm:ss");
map.put(LocalDateTime.parse("10/10/2010 10:10:10", formatter), "...");
要指定地图是排序的,有接口SortedMap。最好使用更通用的接口。排序地图的实现 class 是 TreeMap。然而你想要一个相反的比较。
您可以使用本地特定模式。请注意,上面我选择了 Month/Day 而不是英国 Day/Month.
如果您想继续使用 LinkedHashMap
将其反转,同时保持它的效率并不那么容易。这是一个使用迭代器顺序反转给定 LinkedHashMap
的解决方案(这对于 LinkedHashMap
是可预测的,因此可能是您正在寻找的)。
请注意,使用 SortedMap
或 TreeMap
等其他解决方案可能仍然更好。然而,为了坚持你原来的问题,这里有一个解决方案:
public static <K, V> LinkedHashMap<K, V> reverse(LinkedHashMap<K, V> map)
{
LinkedHashMap<K, V> reversedMap = new LinkedHashMap<K, V>();
ListIterator<Entry<K, V>> it = new ArrayList<>(map.entrySet()).listIterator(map.entrySet().size());
while (it.hasPrevious())
{
Entry<K, V> el = it.previous();
reversedMap.put(el.getKey(), el.getValue());
}
return reversedMap;
}
请注意,遗憾的是,您不会绕过将条目集包装到 ArrayList
中,因为只有这样才能为您提供 ListIterator
,它可以初始化为第一个元素以外的任何点。拥有类似 reverseIterator()
的方法会大大简化生活 - 遗憾的是有 none 可用。
在复杂性方面,您使用这种方法迭代列表两次,第一次是从开始到最后一个元素的 listIterator
调用,然后在使用 previous
时再次从后到前调用。所以你在这里查看 O(2n)。
如果你的动机只是为了反转地图(按降序显示)你可以使用
Java.util.TreeMap.descendingMap() : 它 returns 地图中包含的映射的逆序视图`
LinkedHashMap<String,String> map = .... //this is your intial hashmap
TreeMap<String,String> tmap = new TreeMap<>(map);
map.clear();
map.putAll(tmap.descendingMap());
这样就可以了。
我有一个 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,但我在想是否有更简单的方法来使用像 sort[ 这样的工具来反转保持相同类型的 LinkedHashMap 例如。
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);
}
这是我自己写给你的逻辑。不使用任何内置函数来反转:
LinkedHashMap<String, String> map = new LinkedHashMap<>();
map.put("10/10/2010 10:10:10", "SomeText1");
map.put("10/10/2019 10:10:19", "SomeText2");
map.put("10/10/2020 10:10:20", "SomeText3");
map.put("10/10/2021 10:10:21", "SomeText4");
LinkedHashMap<String, String> reversed = new LinkedHashMap<>();
String[] keys = map.keySet().toArray(new String[map.size()]);
for (int i = keys.length - 1; i >= 0; i--) {
reversed.put(keys[i], map.get(keys[i]));
}
一个LinkedHashMap按插入排序;按关联的日期时间排序更合乎逻辑:
private SortedMap<LocalDateTime, String> map = new TreeMap<>(Comparator.naturalOrder()
.reversed());
LocalDateTimeFormatter formatter = LocalDateTimeFormatter.ofPattern("MM/dd/uuuu HH:mm:ss");
map.put(LocalDateTime.parse("10/10/2010 10:10:10", formatter), "...");
要指定地图是排序的,有接口SortedMap。最好使用更通用的接口。排序地图的实现 class 是 TreeMap。然而你想要一个相反的比较。
您可以使用本地特定模式。请注意,上面我选择了 Month/Day 而不是英国 Day/Month.
如果您想继续使用 LinkedHashMap
将其反转,同时保持它的效率并不那么容易。这是一个使用迭代器顺序反转给定 LinkedHashMap
的解决方案(这对于 LinkedHashMap
是可预测的,因此可能是您正在寻找的)。
请注意,使用 SortedMap
或 TreeMap
等其他解决方案可能仍然更好。然而,为了坚持你原来的问题,这里有一个解决方案:
public static <K, V> LinkedHashMap<K, V> reverse(LinkedHashMap<K, V> map)
{
LinkedHashMap<K, V> reversedMap = new LinkedHashMap<K, V>();
ListIterator<Entry<K, V>> it = new ArrayList<>(map.entrySet()).listIterator(map.entrySet().size());
while (it.hasPrevious())
{
Entry<K, V> el = it.previous();
reversedMap.put(el.getKey(), el.getValue());
}
return reversedMap;
}
请注意,遗憾的是,您不会绕过将条目集包装到 ArrayList
中,因为只有这样才能为您提供 ListIterator
,它可以初始化为第一个元素以外的任何点。拥有类似 reverseIterator()
的方法会大大简化生活 - 遗憾的是有 none 可用。
在复杂性方面,您使用这种方法迭代列表两次,第一次是从开始到最后一个元素的 listIterator
调用,然后在使用 previous
时再次从后到前调用。所以你在这里查看 O(2n)。
如果你的动机只是为了反转地图(按降序显示)你可以使用 Java.util.TreeMap.descendingMap() : 它 returns 地图中包含的映射的逆序视图`
LinkedHashMap<String,String> map = .... //this is your intial hashmap
TreeMap<String,String> tmap = new TreeMap<>(map);
map.clear();
map.putAll(tmap.descendingMap());
这样就可以了。