检查2D LinkedHashSet是否包含特定字符串

时间:2019-12-27 01:38:12

标签: java linkedhashset

我试图查找在我创建的2D LinkedHashSet中是否找到了特定的字符串值。

以下是用于初始化LinkedHashSet的一些代码:

LinkedHashSet<LinkedHashSet<String>> block = new LinkedHashSet<LinkedHashSet<String>>();

我尝试使用.contains这样的内容,但它似乎是错误的参数类型:

  int N = Integer.parseInt(b1.readLine());
            for(int i = 0; i<N; i++) {
                String sorts [] = (b1.readLine()).split(" ");
                if(block.stream().anyMatch(list->list.contains(sorts[0]))) {
                    //System.out.println("I entered");
                    for (Set<String> innerSet : block) {
                        for (String string : innerSet) {
                            if(string.equals(sorts[0])) {
                                innerSet.add(sorts[5]);
                            }
                            if(string.equals(sorts[5])) {
                                innerSet.add(sorts[0]);
                            }
                        }
                    }
                }
                else {
                    block.add(new LinkedHashSet<String>(Arrays.asList(sorts[0], sorts[5]))); 
                } 

2 个答案:

答案 0 :(得分:1)

您可以使用流。

填充您的hashSet。


      Set<Set<String>> nestedSet = new LinkedHashSet<>();

      LinkedHashSet<String> set1 =
            new LinkedHashSet<>(Set.of("alpha", "beta", "gamma", "delta", "epsilon"));
      LinkedHashSet<String> set2 =
            new LinkedHashSet<>(Set.of("apples", "oranges", "pears", "grapes", "bananas"));

      nestedSet.add(set2);
      nestedSet.add(set1);

测试数据

      Map<String, Boolean> testData = Map.of("alpha", true, "pears", true, 
      "papayas", false, "eta", false, "omega", false, "house", false);

运行

      testData.forEach((item, expectedResult)-> {
         System.out.printf("Item = \"%s\", Expected return = %b, actual = %b%n",
               item,expectedResult, exists(nestedSet, item));
      });          

  public static boolean exists(Set<Set<String>> sets,
         String target) {
      return sets.stream().anyMatch(set->set.contains(target));
  }

答案 1 :(得分:1)

您可以使用parallelSteam使该过程并发且快速-

block.parallelStream()
     .filter(stringSet -> 
          stringSet.contains(input))
     .collect(Collectors.toList()).size() >  0

上面的代码采用blockLinkedHashSet<LinkedHashSet<String>>)和input字符串。使用 fork join pool 中的多个 thread 查找不同集合中的输入字符串。最后,它会收集所有包含输入字符串的此类集,并检查其大小是否大于0 ,如果是,则返回true,否则返回false。

编辑1

better version是这个-

block.parallelStream().anyMatch(strings -> strings.contains(input))

这将更有效,因为它只会等待首个比赛并立即返回true。

anyMatch javadoc-

 * Returns whether any elements of this stream match the provided
 * predicate.  May not evaluate the predicate on all elements if not
 * necessary for determining the result.  If the stream is empty then
 * {@code false} is returned and the predicate is not evaluated.