java 计算两个List<String> 左差集 不要用contaions来进行比较 并且提示计算效率
时间: 2024-03-17 18:39:48 浏览: 65
计算两个List<String>的左差集可以使用Java8的Stream API中的`anyMatch`方法来实现,并且优化计算效率可以使用Set来存储其中一个List中的元素,这样判断是否包含在Set中的时间复杂度为O(1),而不是使用List的`contains`方法的O(n)。代码如下:
```java
List<String> list1 = Arrays.asList("a", "b", "c");
List<String> list2 = Arrays.asList("b", "c", "d");
Set<String> set = new HashSet<>(list2);
List<String> diff = list1.stream()
.filter(str -> !set.contains(str))
.collect(Collectors.toList()));
System.out.println(diff); // 输出 [a]
```
上面的代码中,首先将其中一个List中的元素存储到Set中,然后使用`filter`方法过滤出另一个List中不包含在Set中的元素,将结果收集到一个新的List中,最终得到两个List的左差集。
这样可以大大提高计算效率,避免了使用List的`contains`方法时需要遍历整个List的问题,时间复杂度为O(n)。而使用Set的`contains`方法时只需要判断是否包含在Set中,时间复杂度为O(1)。
相关问题
java 计算两个List<String> 共同差集
可以使用Java8的Stream API来计算两个List<String>的共同差集,代码如下:
```java
List<String> list1 = Arrays.asList("a", "b", "c");
List<String> list2 = Arrays.asList("b", "c", "d");
List<String> diff = list1.stream()
.filter(str -> !list2.contains(str))
.collect(Collectors.toList());
diff.addAll(list2.stream()
.filter(str -> !list1.contains(str))
.collect(Collectors.toList()));
System.out.println(diff); // 输出 [a, d]
```
上面的代码首先使用`filter`方法过滤出`list1`中不包含在`list2`中的元素,然后使用`collect`方法将结果收集到一个新的List中。接着使用`filter`方法过滤出`list2`中不包含在`list1`中的元素,然后再次使用`collect`方法将结果添加到之前收集的List中,最终得到两个List的共同差集。
比较两个 List<String> 差集
要比较两个 `List<String>` 的差集,即找到在一个列表中存在而在另一个列表中不存在的元素,你可以使用`removeAll()`方法。这个方法会从一个列表中移除另一个列表中存在的所有元素。以下是一个示例代码:
```java
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> list1 = new ArrayList<>();
list1.add("apple");
list1.add("banana");
list1.add("orange");
List<String> list2 = new ArrayList<>();
list2.add("banana");
list2.add("orange");
list1.removeAll(list2);
System.out.println("列表1中差集元素: " + list1);
}
}
```
在上面的示例中,`list1`和`list2`是两个 `List<String>` 对象。通过调用`list1.removeAll(list2)`方法,将在`list2`中存在的所有元素从`list1`中移除,这样就得到了列表1中的差集。最终输出的结果将会是`[apple]`,表示在列表1中存在而在列表2中不存在的元素是"apple"。
请注意,这个方法会修改原始列表(即在列表1上进行操作),如果你不想修改原始列表,你可以先创建一个副本进行操作。例如:
```java
List<String> list1Copy = new ArrayList<>(list1);
list1Copy.removeAll(list2);
```
这样,`list1Copy`将会是列表1与列表2的差集,而列表1本身不会被修改。
阅读全文