标签: linkedhashmap

使用 Collectors.toMap 返回 LinkedHashMap

我该如何转换:

return this.subjects.entrySet()
            .stream()
            .collect(Collectors.toMap(e -> getArtistryCopy(e.getKey()), Map.Entry::getValue));
Run Code Online (Sandbox Code Playgroud)

要返回 LinkedHashMap 而不是地图?

如果您需要知道,this.subjects是一个LinkedHashMap<AbstractArtistries, ArrayList<AbstractCommand>>. AbstractArtistry 和 command 是我制作的两个自定义对象。我需要维持秩序。

getArtistryCopy() 返回 AbstractArtistry 的副本(这是关键)。

java linkedhashmap collectors

9
推荐指数
1
解决办法
5252
查看次数

查找包含至少n个与另一个键共同的元素的键,包含列表

我有一个LinkedHashMap<String, List<T>>.我正在构建Map,所以也许有更好的方法来组织所有数据.

我试图获得具有共同列表的键,每个列表中至少有2个共同元素.

例如:

Map
----------------------
| Key | Values       |
----------------------
| M1  | [A1, A3]     |
| M2  | [A1, A2, A3] |
| M3  | [A1, A2]     |
| M4  | [A2, A3]     |
----------------------
Run Code Online (Sandbox Code Playgroud)

最后,我想有这个清单: [ [M2, M3], [M2, M4], [M1, M2] ]

  • M2和M3包含A1和A2
  • M2和M4包含A2和A3
  • M1和M2包含A1和A3

我不知道如何将我的第一个条目的值与所有其他条目的值进行比较.依此类推,直到我到达地图的末尾(就像for列表的双循环一样).

我现在的解决方案(但我觉得可能有更好的方法)

List<String> keyList = new ArrayList<>(myMap.keySet());
for(int i = 0 ; i < keyList.size()-1 ; i++) {
    String keyA = keyList.get(i);
    List<T> valuesA …
Run Code Online (Sandbox Code Playgroud)

java linkedhashmap java-8

9
推荐指数
1
解决办法
133
查看次数

要洗牌的键值(整数,字符串)列表的最佳结构

我需要在Java中实现一个键值列表(类型为Integer-String)的结构,我想要将其洗牌.

基本上,我想做那样的事情.

    public LinkedHashMap<Integer, String> getQuestionOptionsMap(){

    LinkedHashMap<Integer, String>  shuffle = new LinkedHashMap<Integer, String> ();

    if (answer1 != null)
        shuffle.put(new Integer(1), answer1);
    if (answer2 != null)
        shuffle.put(new Integer(2), answer2);
    if (answer3 != null)
        shuffle.put(new Integer(3), answer3);
    if (answer4 != null) 
        shuffle.put(new Integer(4), answer4);

    Collections.shuffle(shuffle);
    return shuffle;
}
Run Code Online (Sandbox Code Playgroud)

但是,HashMap不能被洗牌.

我可以从hashmap中随机获取一个键,然后返回链接的元素,但我确信这不是我问题的最佳解决方案.

有没有更好的方法?

提前致谢.

java shuffle hashtable hashmap linkedhashmap

8
推荐指数
2
解决办法
7万
查看次数

从LinkedHashMap构建有序的JSON字符串

我需要在我的插入顺序为键/值对,所以我选择了使用LinkedHashMapHashMap.但我需要将其LinkedHashMap转换为JSON字符串,其中字符串中的顺序LinkedHashMap保持不变.

但目前我通过以下方式实现:

  1. 首先将LinkedHashMap转换为JSON.
  2. 然后将JSON转换为字符串.

    import java.util.LinkedHashMap;
    import java.util.Map;
    
    import org.json.JSONObject;
    
    public class cdf {
        public static void main(String[] args) {
            Map<String,String > myLinkedHashMap =  new LinkedHashMap<String, String>();
            myLinkedHashMap.put("1","first");
            myLinkedHashMap.put("2","second");
            myLinkedHashMap.put("3","third");
    
            JSONObject json = new JSONObject(myLinkedHashMap);
            System.out.println(json.toString());
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

输出是:

{"3":"third","2":"second","1":"first"} . 
Run Code Online (Sandbox Code Playgroud)

但我希望它按插入键的顺序,如下所示:

{"1":"first","2":"second","3":"third"}
Run Code Online (Sandbox Code Playgroud)

一旦我将其LinkedHashMap转换为JSON,它就会失去它的顺序(显然JSON没有顺序的概念),因此字符串也是乱序的.现在,我如何生成一个顺序与LinkedHashMap?相同的JSON字符串?

java string json hashmap linkedhashmap

8
推荐指数
2
解决办法
3万
查看次数

使用get时LRUCache条目重新排序

我检查了LRUCache的官方Android文档,其中说:每次访问一个值时,它都会移动到队列的头部.将值添加到完整缓存时,该队列末尾的值将被逐出,并且可能符合垃圾回收的条件.我想这是双链表,它由缓存使用的linkedhashmap维护.为了检查这种行为,我检查了LruCache的源代码,并检查了get(K key)方法.它进一步调用map的get方法,该方法从底层hashmap获取值并调用recordAccess方法.

public V get(Object key) {
    LinkedHashMapEntry<K,V> e = (LinkedHashMapEntry<K,V>)getEntry(key);
    if (e == null)
        return null;
    e.recordAccess(this);
    return e.value;
}
Run Code Online (Sandbox Code Playgroud)

如果accessOrder设置为true(对于我的问题,我们假设它是),recordAccess方法依次将访问的条目移动到列表的末尾,否则它什么都不做.

/**
     * This method is invoked by the superclass whenever the value
     * of a pre-existing entry is read by Map.get or modified by Map.set.
     * If the enclosing Map is access-ordered, it moves the entry
     * to the end of the list; otherwise, it does nothing.
     */
    void recordAccess(HashMap<K,V> m) {
        LinkedHashMap<K,V> lm …
Run Code Online (Sandbox Code Playgroud)

java android linkedhashmap android-lru-cache

8
推荐指数
1
解决办法
424
查看次数

Get LinkedList of entries from LinkedHashMap with values() method

I'm trying to understand if I can get a linked list of entries from my linked hash map. I can get entrySet() and then using iterator I get through each entry in the insertion order. This will give me the linked list of entries in the insertion order.

Can I guarantee the same result if I use the values() method?

java collections dictionary linkedhashmap

8
推荐指数
1
解决办法
148
查看次数

LinkedHashMaps与LinkedHashSets的优缺点是什么?

有人可以解释一个选择另一个的主要好处以及该选择带来的不利因素吗?

java linkedhashmap linkedhashset

7
推荐指数
2
解决办法
1万
查看次数

如何通过LinkedHashMap <String,ArrayList <String >>创建循环?

请帮我创建一个循环LinkedHashMap<String,ArrayList<String>> h:

if (h.get("key1").size() == 0)
    System.out.println("There is no errors in key1.");
else
    System.out.println("ERROR: there are unexpected errors in key1.");

if (h.get("key2").size() == 0)
    System.out.println("There is no errors in key2.");
else
    System.out.println("ERROR: there are unexpected errors in key2.");

if (h.get("key3").size() == 0)
    System.out.println("There is no errors in key3.");
else
    System.out.println("ERROR: there are unexpected errors in key3.");

if (h.get("key4").size() == 0)
    System.out.println("There is no errors in key4.\n");
else
    System.out.println("ERROR: there are unexpected errors in key4.\n");
Run Code Online (Sandbox Code Playgroud)

java loops map linkedhashmap

7
推荐指数
3
解决办法
3万
查看次数

获取LinkedHashMap中最后一个键或值的最方便方法是什么?

LinkedHashMap说明"它维护着一个贯穿其所有条目的双向链表",所以我想知道如何输入最后一个条目或密钥?我可以自信地转发.values()LinkedList获得那个双重链接列表并使用.getLast()它吗?或者它是其他Java集合的实例?

java.util如果可能,我想坚持下去.

java key linkedhashmap

7
推荐指数
1
解决办法
9845
查看次数

LinkedHashMap entrySet的顺序未保存在流中(Android)

我正在为注册屏幕创建一个非常简单的表单验证实用程序,并且我遇到了一些意外的行为LinkedHashMap和从它创建的流entrySet.

我将验证结果存储在a中LinkedHashMap,具有以下语句顺序:

Map<ValidationResult.SignUpField, Boolean> fieldStatuses = new LinkedHashMap<>();

fieldStatuses.put(EMAIL, isValidEmail(emailAddress));
fieldStatuses.put(USERNAME, isValidUsername(username));
fieldStatuses.put(BIRTHDAY, isValidBirthday(birthday));
fieldStatuses.put(PASSWORD, isValidPassword(password));
fieldStatuses.put(CONFIRM_PASSWORD, password.equals(confirmedPassword));

List<ValidationEntry> invalidFields = aggregateInvalidFields(fieldStatuses);
Run Code Online (Sandbox Code Playgroud)

除了"确认密码"之外,一个特定的迭代产生上述所有字段无效.在条目集上使用简单的for循环并省略有效结果,无效结果按以下顺序显示:

  • 电子邮件
  • 用户名
  • 生日
  • 密码

然后我尝试使用Android上可用的Stream API子集(目标版本25,最小值为19,因此缺少Collectors.toMap()):

private static List<ValidationEntry> aggregateInvalidFields(Map<ValidationResult.SignUpField, Boolean> fields) {
    List<ValidationEntry> invalidFields = new ArrayList<>();
    fields.entrySet()
            .stream()
            .filter(entry -> !entry.getValue())
            .forEachOrdered(entry -> {
                ValidationResult.SignUpField field = entry.getKey();
                invalidFields.add(new ValidationEntry(field, lookUpErrorCode(field)));
            });
    return invalidFields;
}
Run Code Online (Sandbox Code Playgroud)

但该代码产生以下顺序:

  • 生日
  • 密码
  • 用户名
  • 电子邮件

这里究竟发生了什么,为什么流的结果不符合LinkedHashMap?的插入顺序?需要注意的是,如果我换出forEachOrderedforEach,它仍然没有插入排序.

java android linkedhashmap java-stream

7
推荐指数
1
解决办法
543
查看次数