android 将LinkedHashMap的顺序反转为LinkedHashMap或ArrayList

osh3o9ms  于 2023-05-05  发布在  Android
关注(0)|答案(5)|浏览(253)

我有一个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);
}
laximzn5

laximzn51#

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), "...");

要指定Map是排序的,可以使用SortedMap接口。最好使用一个接口,这样更通用。排序Map的实现类是TreeMap。但是你想要一个反向比较。
您可以使用本地特定模式。请注意,上面我选择了月/日,而不是英国日/月。

fykwrbwg

fykwrbwg2#

如果你的目的只是为了反转Map(按降序显示),你可以使用**Java.util.TreeMap.descendingMap():**它返回Map中包含的Map的逆序视图`

LinkedHashMap<String,String> map = .... //this is your intial hashmap
TreeMap<String,String> tmap = new TreeMap<>(map);
map.clear();
map.putAll(tmap.descendingMap());
  • 这就行了 *
9ceoxa92

9ceoxa923#

这是我写的逻辑。而不使用任何内置函数来反转:

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]));
    }
u5i3ibmn

u5i3ibmn4#

如果你想继续使用LinkedHashMap,在保持效率的同时反转它并不容易。这是一个使用迭代器顺序反转给定LinkedHashMap的解决方案(这对于LinkedHashMap是可预测的,因此可能是您正在寻找的)。
请注意,使用SortedMapTreeMap等其他解决方案可能更好。然而,为了坚持你最初的问题,这里有一个解决方案:

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;
}

请注意,遗憾的是,您不会将条目集 Package 到ArrayList中,因为这只为您提供了一个ListIterator,它可以初始化为第一个元素以外的任何点。拥有类似reverseIterator()的方法可以大大简化生活--遗憾的是没有可用的方法。
从复杂性的Angular 来看,使用这种方法可以迭代列表两次,第一次是从开始到最后一个元素的listIterator调用,然后在使用previous时从后面到前面再迭代一次。所以这里的时间复杂度是O(2n)。

juud5qan

juud5qan5#

JEP 431: Sequenced Collections在即将到来的Java版本21中添加了一个reversed()方法到LinkedHashMap。这将返回贴图的反转视图。

LinkedHashMap<String, String> map = ...;
LinkedHashMap<String, String> reversed = map.reversed();

相关问题