一个特殊的List去重问题的解决方案

原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/7039842.html

  场景描述:公司新活动,需要在活动页面显示指定利率的四种投资项目,并且如果存在同利率投资项目,要显示进度最低的投资项目,现在对问题进行简化,以字符串的形式进行描述:我们用list1来存放从数据库查询得到的所以符合条件的投资项目列表,现在对这个列表进行去重。

  我们取出多余字段,并将有关字段拼装成字符串形式来进行模拟:比如"1.1-20"表示利率为1.1%,进度为20%的项目。

  下面贴出实现算法:(主要就是关于List的去重问题)

 1     public static void main(String[] args) {
 2         List<String> list1 = new ArrayList<>();
 3         List<String> list2 = new ArrayList<>();
 4         list1.add("1.1-10");
 5         list1.add("2.2-10");
 6         list1.add("2.2-20");
 7         list1.add("4.4-20");
 8         list1.add("3.3-30");
 9         list1.add("2.2-5");
10         list1.add("4.4-50");
11         a:for(String s1 : list1){
12             if(list2.isEmpty()){
13                 list2.add(s1);
14             }else{
15                 int j = 0;
16                 for(String s2 : list2){
17                     j++;
18                     if(s2.substring(0, 2).equals(s1.substring(0, 2))){
19                         if(Double.valueOf(s2.substring(4)) >= Double.valueOf(s1.substring(4))){
20                             list2.remove(s2);
21                             list2.add(s1);
22                             continue a;//这里不能是break,因为如果写成break,会导致错误:j和list2.size()的比较有一个错误点,那就是在list1的元素与list2中的最后一个元素有关,发生替换操作之后,break会跳出当前循环,但是会继续执行外部循环剩余的代码,去执行j与list2.size()的比较,结果会将这个元素再写入一次,所以这里直接跳转到外部循环开启的位置,来避免这种错误
23                         }else{
24                             continue a;//此处问题同上
25                         }
26                     }else{
27                         continue;
28                     }
29                 }
30                 if(j == list2.size()){
31                     list2.add(s1);
32                 }
33             }
34         }
35         System.out.println(list2);
36     }

执行结果:

[1.1-10, 4.4-20, 3.3-30, 2.2-5]

 第二种实现:

 1     public static void main(String[] args) {
 2         List<String> list1 = new ArrayList<String>();
 3         List<String> list2 = new ArrayList<String>();
 4         list1.add("1.1-30");
 5         list1.add("1.1-40");
 6         list1.add("1.1-50");
 7         list1.add("1.1-60");
 8         list1.add("2.2-20");
 9         list1.add("1.1-20");
10         list1.add("3.3-10");
11         list1.add("3.3-20");
12         list1.add("2.2-10");
13         list1.add("1.1-10");
14         list1.add("2.2-5");
15         list1.add("4.4-12");
16         list1.add("4.4-11");
17         for(String s1:list1){
18             if(list2.isEmpty()){
19                 list2.add(s1);
20             }else{
21                 int j = 0;
22                 for(String s2:list2){
23                     j++;
24                     if(s1.substring(0,2).equals(s2.substring(0,2))){
25                         if(Double.parseDouble(s2.substring(4)) >= Double.parseDouble(s1.substring(4))){
26                             list2.remove(s2);
27                             list2.add(s1);
28                             break;
29                         }else{
30                             break;
31                         }
32                     }else if(j == list2.size()){
33                         list2.add(s1);
34                         break;
35                     }else{
36                         continue;
37                     }
38                 }
39             }
40         }
41         System.out.println(list2);
42     }

运行结果:

[3.3-10, 1.1-10, 2.2-5, 4.4-11]
原文地址:https://www.cnblogs.com/V1haoge/p/7039842.html