LinkedHashMap与LinkedHashMap或ArrayList的相反顺序

时间:2018-07-09 11:14:05

标签: java android hashmap linkedhashmap

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

4 个答案:

答案 0 :(得分:2)

一个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。更好地使用接口,这是更通用的。排序映射的实现类是TreeMap。但是,您需要反向比较。

您可以使用本地特定模式。请记住,在上面我选择的是月/日,而不是英国的日/月。

答案 1 :(得分:1)

如果您的动机只是反转地图(以降序显示),则可以使用 Java.util.TreeMap.descendingMap()::它返回地图中包含的映射的逆序视图。

LinkedHashMap<String,String> map = .... //this is your intial hashmap
TreeMap<String,String> tmap = new TreeMap<>(map);
map.clear();
map.putAll(tmap.descendingMap());

这可以解决问题。

答案 2 :(得分:0)

这是给您的我自己的书面逻辑。而不使用任何内置函数来反转:

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

答案 3 :(得分:0)

如果您想继续使用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;
}

请注意,您不会无所事事地将条目集包装到ArrayList中,因为只有这样才能为您提供一个ListIterator,可以将其初始化为除第一个元素以外的任何点。使用类似reverseIterator()的方法会大大简化生活-遗憾的是没有可用的方法。

出于复杂性的考虑,您可以使用这种方法对列表进行两次迭代,首先是使用listIterator从开始到最后一个元素对previous的调用,然后是从后到前的调用。因此,您正在这里查看 O(2n)