为了账号安全,请及时绑定邮箱和手机立即绑定

使用“动态”后缀将唯一元素添加到 ArrayList

使用“动态”后缀将唯一元素添加到 ArrayList

茅侃侃 2022-06-30 17:51:09
我在 Stack 中看到过类似的问题,但它是针对 C 中的文件的。情况:我有一个 ArrayList of Strings ,其中元素是电子邮件。例如:jony@test.comjony1@test.comgerd@test.com等等我想编写一个函数/方法,它将向该列表添加一封新电子邮件,其中包含一个非常重要的问题!:例如,如果我想添加“jony@test.com”,该方法应该通过 ArrayList,如果“jony@test.com”已经存在,那么它会检查“jony1@test.com”是否存在等,直到它找到免费号码后缀,然后添加它。在我们的示例中,它应该添加“jony2@test.com”。问题是我想要一些简短而优雅的解决方案,我写的是丑陋的 150 行代码和 3 种方法等,看起来不太好。任何人都有一个很好的算法或者可能是高级的 Collection 功能来完成这个?
查看完整描述

4 回答

?
ibeautiful

TA贡献1993条经验 获得超5个赞

您可以在添加之前检查您的列表,如下所示:


public void addWithSuffix(String email) {

    if(list.contains(email)) {

        int number = 0;

        String[] tmp = email.split("@");


        for(; list.contains(tmp[0] + number + "@" + tmp[1]); number++){}


        list.add((tmp[0] + number + "@" + tmp[1]));

    }

    else {

        list.add(email);

    }

}

但是,当然,在尝试添加之前验证您的输入以确保电子邮件有效。而且我还建议将 a 换成ListaSet


查看完整回答
反对 回复 2022-06-30
?
倚天杖

TA贡献1828条经验 获得超3个赞

创建自定义添加方法并使用拆分值并检查直到达到最大值,


import java.util.ArrayList;

import java.util.List;


public class CustomListAdd {



    public static void main(String[] args) {

        List <String> list=new ArrayList<String>();

        add("jony@test.com",list);

        add("jony@test.com",list);

        add("jony@test.com",list);

        add("jony@test.com",list);

        System.out.println(list);

    }

    public static void add(String value,List<String> list) {

        if(list.contains(value)) {

            int count = 1;

            String[] strSplited = value.split("@");


            while(list.contains(strSplited[0] + count + "@" + strSplited[1]))

                count++;

            list.add((strSplited[0] + count + "@" + strSplited[1]));

        }

        else {

            list.add(value);

        }

    }

}


查看完整回答
反对 回复 2022-06-30
?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

尝试这个


主班


List <String> list=new ArrayList<String>();

    list.add("jony@test.com");

    list.add("jony1@test.com");

    list.add("jony2@test.com");

    list.add("jony3@test.com");

    list.add("gerd@test.com");

    String newEmail = "jony@test.com";

    String last = "";

    for (String string : list) {

        if(compareString(newEmail , string)){

            last = string;

        }

    }

    int newNumber = Integer.valueOf(last.substring(last.indexOf("@")-1, last.indexOf("@")))+1;

    String[] s = newEmail.split("@");

    list.add(s[0]+ newNumber + s[1]);

    System.out.println(list);

替换数字后比较字符串


private static boolean compareString(String string, String string2) {

    string2 = string2.replaceAll("\\d","");

    return string.equals(string2);

}


查看完整回答
反对 回复 2022-06-30
?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

尝试这个:


import java.io.*;

import java.util.*;


public class DynamicMail{


private Map<String, Integer> map = new HashMap<>();

private List<String> emails = new ArrayList<>();


public static void main(String args[]){

    DynamicMail dm = new DynamicMail();

    dm.addToList("jony@test.com");

    dm.addToList("gary@test.com");

    dm.addToList("jony@test.com");

    dm.addToList("jony@test.com");

    dm.addToList("jony@test.com");

    dm.addToList("gary@test.com");

    dm.addToList("ghost@test.com");


    System.out.println(dm.getEmails());

}


public Map<String, Integer> getMap(){

    return map;

}


public List<String> getEmails(){

    return emails;

}


public void addToList(String email){

    String[] parts = email.split("@");

    Integer i = map.computeIfAbsent(parts[0], x->new Integer(0));

    if(i!=0)

        emails.add(parts[0]+i+"@"+parts[1]);

    else

        emails.add(email);

    map.put(parts[0], ++i);


}

}

假设您从一个空列表开始,并且 jony1@test.com 或 gerd2@test.com 之类的电子邮件不会作为输入,这将起作用。


查看完整回答
反对 回复 2022-06-30
  • 4 回答
  • 0 关注
  • 114 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信