我该如何转换:
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 的副本(这是关键)。
我有一个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] ]
我不知道如何将我的第一个条目的值与所有其他条目的值进行比较.依此类推,直到我到达地图的末尾(就像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中实现一个键值列表(类型为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中随机获取一个键,然后返回链接的元素,但我确信这不是我问题的最佳解决方案.
有没有更好的方法?
提前致谢.
我需要在我的插入顺序为键/值对,所以我选择了使用LinkedHashMap过HashMap.但我需要将其LinkedHashMap转换为JSON字符串,其中字符串中的顺序LinkedHashMap保持不变.
但目前我通过以下方式实现:
然后将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字符串?
我检查了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) 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?
有人可以解释一个选择另一个的主要好处以及该选择带来的不利因素吗?
请帮我创建一个循环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) LinkedHashMap说明"它维护着一个贯穿其所有条目的双向链表",所以我想知道如何输入最后一个条目或密钥?我可以自信地转发.values()以LinkedList获得那个双重链接列表并使用.getLast()它吗?或者它是其他Java集合的实例?
java.util如果可能,我想坚持下去.
我正在为注册屏幕创建一个非常简单的表单验证实用程序,并且我遇到了一些意外的行为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?的插入顺序?需要注意的是,如果我换出forEachOrdered用forEach,它仍然没有插入排序.
java ×10
linkedhashmap ×10
android ×2
hashmap ×2
collections ×1
collectors ×1
dictionary ×1
hashtable ×1
java-8 ×1
java-stream ×1
json ×1
key ×1
loops ×1
map ×1
shuffle ×1
string ×1