飞道的博客

java面试题(5):List去重方案

415人阅读  评论(0)

本文总结了 5 种去除List重复元素的方法:

  • for 循环添加去重
  • for 双循环去重
  • for 循环重复坐标去重
  • Set 去重
  • Stream 去重

最后两种方案最简单,都是一行代码就能搞定的

1 for循环添加去重


  
  1. package com.example.demo.controller;
  2. import java.util.ArrayList;
  3. import java.util.Arrays;
  4. import java.util.List;
  5. public class listtest 2 {
  6. public static List < String > initList = Arrays.asList(
  7. "张三",
  8. "李四",
  9. "张三",
  10. "周一",
  11. "刘四",
  12. "李强",
  13. "李白",
  14. "张三",
  15. "李强",
  16. "王五"
  17. );
  18. public static void main( String[] args) {
  19. List < String > list = new ArrayList(initList);
  20. List < String > list 2 = new ArrayList <>();
  21. for ( String element : list) {
  22. if (!list 2. contains(element)) {
  23. list 2. add(element);
  24. }
  25. }
  26. System.out.println(list 2);
  27. }
  28. }

这个是最基本的实现了,创建一个空的 List,添加前判断一下存在不存在,不存在才添加,这样就保证了元素不重复。

输出结果:

 

2 for双循环去重


  
  1. package com.example.demo.controller;
  2. import java.util.ArrayList;
  3. import java.util.Arrays;
  4. import java.util.List;
  5. public class listtest 2 {
  6. public static List < String > initList = Arrays.asList(
  7. "张三",
  8. "李四",
  9. "张三",
  10. "周一",
  11. "刘四",
  12. "李强",
  13. "李白",
  14. "张三",
  15. "李强",
  16. "王五"
  17. );
  18. public static void main( String[] args) {
  19. List < String > list = new ArrayList(initList);
  20. for (int i = 0; i < list. size() - 1; i + +) {
  21. for (int j = list. size() - 1; j > i; j--) {
  22. if (list. get(j).equals(list. get(i))) {
  23. list.remove(j);
  24. }
  25. }
  26. }
  27. System.out.println(list);
  28. }
  29. }

利用双循环,判断是否有相等的,再进行移除。

输出结果:

 

3 for循环重复坐标去重


  
  1. package com.example.demo.controller;
  2. import java.util.ArrayList;
  3. import java.util.Arrays;
  4. import java.util.List;
  5. public class listtest 2 {
  6. public static List < String > initList = Arrays.asList(
  7. "张三",
  8. "李四",
  9. "张三",
  10. "周一",
  11. "刘四",
  12. "李强",
  13. "李白",
  14. "张三",
  15. "李强",
  16. "王五"
  17. );
  18. public static void main( String[] args) {
  19. List < String > list = new ArrayList(initList);
  20. List < String > list 2 = new ArrayList(initList);
  21. for ( String element : list 2) {
  22. if (list.indexOf(element) ! = list.lastIndexOf(element)) {
  23. list.remove(list.lastIndexOf(element));
  24. }
  25. }
  26. System.out.println(list);
  27. }
  28. }

复制一个 list2,再循环 List2,判断 list 中的元素的首尾出现的坐标位置是否一致,如果一致,则说明没有重复的,否则重复,再删除重复的位置的元素。

输出结果:

 

4 Set去重


  
  1. package com.example.demo.controller;
  2. import java.util.ArrayList;
  3. import java.util.Arrays;
  4. import java.util.HashSet;
  5. import java.util.List;
  6. public class listtest 2 {
  7. public static List < String > initList = Arrays.asList(
  8. "张三",
  9. "李四",
  10. "张三",
  11. "周一",
  12. "刘四",
  13. "李强",
  14. "李白",
  15. "张三",
  16. "李强",
  17. "王五"
  18. );
  19. public static void main( String[] args) {
  20. List < String > list = new ArrayList(initList);
  21. List < String > list 2 = new ArrayList(new HashSet(list));
  22. System.out.println(list 2);
  23. }
  24. }

我们知道 Set 是不包含重复元素的,把 List 先装进 HashSet,然后再装回来,这样就保证了元素的不重复。

输出结果:

 

结果虽然正确,但元素顺序和原始 List 不一致,如果要保证顺序性,可以把 HashSet 换成 LinkedHashSet:


  
  1. package com.example.demo.controller;
  2. import java.util. *;
  3. public class listtest 2 {
  4. public static List < String > initList = Arrays.asList(
  5. "张三",
  6. "李四",
  7. "张三",
  8. "周一",
  9. "刘四",
  10. "李强",
  11. "李白",
  12. "张三",
  13. "李强",
  14. "王五"
  15. );
  16. public static void main( String[] args) {
  17. List < String > list = new ArrayList(initList);
  18. List < String > list 2 = new ArrayList(new LinkedHashSet(list));
  19. System.out.println(list 2);
  20. }
  21. }

输出结果:

 

这下顺序对了吧,LinkedHashSet 可以保证元素的顺序性!

5 Stream去重


  
  1. package com.example.demo.controller;
  2. import java.util. *;
  3. import java.util.stream.Collectors;
  4. public class listtest 2 {
  5. public static List < String > initList = Arrays.asList(
  6. "张三",
  7. "李四",
  8. "张三",
  9. "周一",
  10. "刘四",
  11. "李强",
  12. "李白",
  13. "张三",
  14. "李强",
  15. "王五"
  16. );
  17. public static void main( String[] args) {
  18. List < String > list = new ArrayList(initList);
  19. list = list.stream().distinct().collect(Collectors.toList());
  20. System.out.println(list);
  21. }
  22. }

输出结果:

 

利用 Stream 的 distinct 方法去重,这个方法也十分简单,一行代码搞定


转载:https://blog.csdn.net/u013938578/article/details/129127974
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场