使用“ dynamic”后缀向ArrayList添加唯一元素

时间:2019-02-21 15:18:26

标签: java

我在Stack中看到了类似的问题,但这是C语言中的文件。 情况: 我有一个ArrayList of Strings,该元素是一封电子邮件。例如:

jony@test.com
jony1@test.com
gerd@test.com

我想编写一个函数/方法,该函数/方法将向该列表添加新电子邮件,并附带一个非常重要的要点!:

例如,如果我想添加“ jony@test.com”,则该方法应通过     ArrayList,如果“ jony@test.com”已经存在,则检查“ jony1@test.com”是否存在等,直到找到空闲数字后缀,然后添加它。在我们的示例中,应该添加“ jony2 @ test”。 com”。

问题是我想要一些简短而优雅的解决方案,我写的是    用3种方法等的丑陋的150行代码,看起来还不行。 是否拥有精巧的算法或高级Collection的专长来实现这一目标?

谢谢

4 个答案:

答案 0 :(得分:1)

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

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);
    }
}

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

答案 1 :(得分:1)

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

def builder = new NullObject()

答案 2 :(得分:0)

尝试一下:

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这样的电子邮件将不作为输入,这将起作用。

答案 3 :(得分:0)

  

尝试

     

主班

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);
}