Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用“添加唯一元素到ArrayList”;“动态”;后缀_Java - Fatal编程技术网

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

Java 使用“添加唯一元素到ArrayList”;“动态”;后缀,java,Java,我在堆栈中看到过类似的问题,但它是针对C中的文件的。 情况: 我有一个字符串数组列表,其中的元素是电子邮件。例如: jony@test.com jony1@test.com gerd@test.com 等等 我想写一个函数/方法,它将向该列表中添加一封新的电子邮件,其中包含一个非常重要的提示!: 例如,如果我想添加“jony@test.com“,该方法应通过 ArrayList和if“jony@test.com已存在,然后检查是否jony1@test.com“存在等,直到它找到自由数字后缀,然

我在堆栈中看到过类似的问题,但它是针对C中的文件的。 情况: 我有一个字符串数组列表,其中的元素是电子邮件。例如:

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

我想写一个函数/方法,它将向该列表中添加一封新的电子邮件,其中包含一个非常重要的提示!:

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

问题是我想要一些简短而优雅的解决方案,我写的是 丑陋的150行代码,包括3个方法等等,看起来不太好。 有谁有一个好的算法或者先进的集合来完成这个任务


谢谢

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

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

但是,当然,在尝试添加电子邮件之前,请验证您的输入以确保电子邮件有效。我还建议将
列表
替换为
集合

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

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);
        }
    }
}
import java.util.ArrayList;
导入java.util.List;
公共类CustomListAdd{
公共静态void main(字符串[]args){
列表=新的ArrayList();
加(”jony@test.com“,列表);
加(”jony@test.com“,列表);
加(”jony@test.com“,列表);
加(”jony@test.com“,列表);
系统输出打印项次(列表);
}
公共静态void add(字符串值、列表){
if(列表包含(值)){
整数计数=1;
字符串[]strSplited=value.split(“@”);
while(list.contains(strSplited[0]+count+“@”+strSplited[1]))
计数++;
列表.添加((strSplited[0]+count+“@”+strSplited[1]);
}
否则{
列表。添加(值);
}
}
}
试试这个:

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

}
}
import java.io.*;
导入java.util.*;
公共类动态邮件{
私有映射映射=新的HashMap();
私有列表电子邮件=新建ArrayList();
公共静态void main(字符串参数[]){
DynamicMail dm=新的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());
}
公共地图getMap(){
返回图;
}
公共列表getEmails(){
回复邮件;
}
公共无效地址列表(字符串电子邮件){
String[]parts=email.split(“@”);
整数i=map.computeIfAbsent(部分[0],x->新整数(0));
如果(i!=0)
添加(部分[0]+i+“@”+部分[1]);
其他的
电子邮件。添加(电子邮件);
map.put(部分[0],++i);
}
}
假设你从一个空的列表和类似的电子邮件开始,这将起作用jony1@test.com或gerd2@test.com不会成为输入

试试这个

主类


您应该访问Stackexchange进行代码检查。除此之外。。150 LOC?也许你应该考虑使用一个SET而不是一个列表,它会减少验证过程。然后你基本上要做以下工作:1)将电子邮件分成
@
前后的部分,2)检查邮件是否已经存在于集合中,3)如果存在,则启动一个递增数字的循环,构建电子邮件以检查为
部分[0]+数字+“@”+部分[1]
并检查该电子邮件-如果该电子邮件存在,则增加该数字并重试,如果没有,则添加该数字并中断循环。大概是10行左右请尝试一下,如果你有困难发布你已经拥有的代码。最初我想到了一个集合,但问题是我需要通过索引获取元素,所以排序方式如果你输入jony1@test.com,在列表中?应该加上jony11@test.com或jony2@test.com或者不会有这样的输入?谢谢,就这样,我想不出来了,因为我忘了for循环可以用那种方式。再次谢谢你!谢谢
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);
}