如何过滤哈希图并找到第一次出现
how to filter hashmap and find 1st occurance
我已经将我的 hashmap 转换为 json,因为我不知道它在 java
中是什么样子
所以我的哈希图看起来像
{"1":[true,false],
"2":[true,true],
"3":[true]}
我需要在单个键中获取数组列表中所有 true 的第一次出现
在这种情况下,它的 2 是第一次出现
所以如果发生了 /// 做其他事情 // 做其他事情
hm.forEach((key, value) -> {
for (Object object : value) {
boolean b = (boolean)object;
if(!b){
break;
}else{
System.out.println(key+"->"+b);
}
}
});
我尝试过类似的方法,但我在这里迷失了它的测试所有案例
任何帮助将不胜感激
您可以使用此架构
hm.entrySet().stream().filter(SomeClass::isAllBoolean)
.findFirst()
.ifPresent(System.out::println);
private static boolean isAllBoolean(Map.Entry<String, List<Boolean>> values) {
}
SomeClass
是 class,其中 isAllBoolean
方法所在。
试试下面的代码片段。
hm.forEach((key, value) -> {
boolean allTrue=true;
for (Object object : value) {
allTrue = (boolean)object;
if(!allTrue){ //stop if you found a false in the true/false array
break;
}
}//out of the inner iteration
if(allTrue){//if this variable is true, it means the above iteration had all values true
//do your stuff
break;
}
allTrue=true; //reset
});
显然你需要一个 filter
来检查一个全真布尔数组,一个 findFirst
来找到第一个和一个 get
来处理 [=12] =] returns 一个 Optional
.
public void test(String[] args) {
Map<String, Boolean[]> hm = new HashMap<>();
hm.put("1", new Boolean[]{true, false});
hm.put("2", new Boolean[]{true, true});
hm.put("3", new Boolean[]{true});
Map.Entry<String, Boolean[]> first = hm.entrySet().stream()
.filter(es -> allTrue(es.getValue()))
.findFirst()
.orElse(null);
System.out.println(first.getKey()+" -> "+ Arrays.toString(first.getValue()));
}
private boolean allTrue(Boolean[] a) {
for (Boolean b : a) {
if (!b) return false;
}
return true;
}
打印
2 -> [true, true]
顺便说一句:未定义 Map
的迭代顺序,因此您通过尝试捕获 first
来依赖未记录的功能。
我已经将我的 hashmap 转换为 json,因为我不知道它在 java
中是什么样子所以我的哈希图看起来像
{"1":[true,false],
"2":[true,true],
"3":[true]}
我需要在单个键中获取数组列表中所有 true 的第一次出现
在这种情况下,它的 2 是第一次出现
所以如果发生了 /// 做其他事情 // 做其他事情
hm.forEach((key, value) -> {
for (Object object : value) {
boolean b = (boolean)object;
if(!b){
break;
}else{
System.out.println(key+"->"+b);
}
}
});
我尝试过类似的方法,但我在这里迷失了它的测试所有案例
任何帮助将不胜感激
您可以使用此架构
hm.entrySet().stream().filter(SomeClass::isAllBoolean)
.findFirst()
.ifPresent(System.out::println);
private static boolean isAllBoolean(Map.Entry<String, List<Boolean>> values) {
}
SomeClass
是 class,其中 isAllBoolean
方法所在。
试试下面的代码片段。
hm.forEach((key, value) -> {
boolean allTrue=true;
for (Object object : value) {
allTrue = (boolean)object;
if(!allTrue){ //stop if you found a false in the true/false array
break;
}
}//out of the inner iteration
if(allTrue){//if this variable is true, it means the above iteration had all values true
//do your stuff
break;
}
allTrue=true; //reset
});
显然你需要一个 filter
来检查一个全真布尔数组,一个 findFirst
来找到第一个和一个 get
来处理 [=12] =] returns 一个 Optional
.
public void test(String[] args) {
Map<String, Boolean[]> hm = new HashMap<>();
hm.put("1", new Boolean[]{true, false});
hm.put("2", new Boolean[]{true, true});
hm.put("3", new Boolean[]{true});
Map.Entry<String, Boolean[]> first = hm.entrySet().stream()
.filter(es -> allTrue(es.getValue()))
.findFirst()
.orElse(null);
System.out.println(first.getKey()+" -> "+ Arrays.toString(first.getValue()));
}
private boolean allTrue(Boolean[] a) {
for (Boolean b : a) {
if (!b) return false;
}
return true;
}
打印
2 -> [true, true]
顺便说一句:未定义 Map
的迭代顺序,因此您通过尝试捕获 first
来依赖未记录的功能。