• 一个特殊的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]
  • 相关阅读:
    docker初次体验-管理MySQL+tomcat镜像
    使用Eclipse可以方便的统计工程或文件的代码行数,
    This Android SDK requires Android Developer Toolkit version 17.0.0 or above. Current version is 10.0.0.v201102162101-104271. Please update ADT to the latest version.
    vim乱码问题
    文件上传和下载
    Freemaker的了解
    find命令
    shell文件安全与权限 笔记
    linux java环境配置
    linux redhat下oracle11G安装
  • 原文地址:https://www.cnblogs.com/V1haoge/p/7039842.html
Copyright © 2020-2023  润新知