在Java中比较、处理和删除列表中的条目

在Java中比较、处理和删除列表中的条目,java,Java,我有两个带有对象的列表,其中列表1(名称)只有全名而没有中间名,还有一个列表2(全名)有全名而中间名。如果列表1的名称类似于巴拉克·奥巴马,而列表2的名称类似于巴拉克·侯赛因·奥巴马,这与中间名相同。然后我必须删除列表1中的条目barack obama public class Test { public static void main(String args[]) { List<String> names = new ArrayList<&

我有两个带有对象的列表,其中列表1(名称)只有
全名而没有中间名
,还有一个列表2(全名)有
全名而中间名
。如果列表1的名称类似于巴拉克·奥巴马,而列表2的名称类似于巴拉克·侯赛因·奥巴马,这与中间名相同。然后我必须删除列表1中的条目
barack obama

public class Test {

       public static void main(String args[]) {

        List<String> names = new ArrayList<>()
        names.add("shannon sperling");
        names.add("john smith");
        names.add("Mary Smith");
        names.add("kim taylor");
        names.add("Barack obama");
        List<String> fullnames = new ArrayList<>();
        fullnames.add("Mary Elizabeth Smith");
        fullnames.add("Lou Henry Hoover");
        fullnames.add("Barack hussein obama");
        for(Object process :names)
        {
            if(fullnames.contains(process))
            {
               names.remove(process);
            }
        }
        System.out.println(names);

       }
}
我尝试了下面的代码,但它没有删除列表1中的条目

public class Test {

       public static void main(String args[]) {

        List<String> names = new ArrayList<>()
        names.add("shannon sperling");
        names.add("john smith");
        names.add("Mary Smith");
        names.add("kim taylor");
        names.add("Barack obama");
        List<String> fullnames = new ArrayList<>();
        fullnames.add("Mary Elizabeth Smith");
        fullnames.add("Lou Henry Hoover");
        fullnames.add("Barack hussein obama");
        for(Object process :names)
        {
            if(fullnames.contains(process))
            {
               names.remove(process);
            }
        }
        System.out.println(names);

       }
}
公共类测试{
公共静态void main(字符串参数[]){
列表名称=新的ArrayList()
名称。添加(“shannon sperling”);
名称。添加(“约翰·史密斯”);
姓名。添加(“玛丽·史密斯”);
姓名。添加(“kim taylor”);
姓名。添加(“巴拉克·奥巴马”);
List fullnames=new ArrayList();
全名。加上(“玛丽·伊丽莎白·史密斯”);
全名。添加(“卢·亨利·胡佛”);
全名。添加(“巴拉克·侯赛因·奥巴马”);
for(对象进程:名称)
{
if(全名.包含(进程))
{
名称。删除(流程);
}
}
System.out.println(名称);
}
}
List.contains()
检查相同的对象<代码>“巴拉克·奥巴马”和
“巴拉克·侯赛因·奥巴马”
显然不一样。您需要重写
contains()
或实现一个自己的类来实现
List
,并添加一个附加函数以您喜欢的方式比较内容。否则,您的代码块看起来不错。

List.contains()
检查相同的对象<代码>“巴拉克·奥巴马”和
“巴拉克·侯赛因·奥巴马”
显然不一样。您需要重写
contains()
或实现一个自己的类来实现
List
,并添加一个附加函数以您喜欢的方式比较内容。否则您的代码块看起来不错。

试试这个

for(Object process :names)
        {
            for(Object process1 :fullnames)
            {
            if(process1.contains(process))
            {
               System.out.println("match found");
            }
            }
        }
试试这个

for(Object process :names)
        {
            for(Object process1 :fullnames)
            {
            if(process1.contains(process))
            {
               System.out.println("match found");
            }
            }
        }

使用
String.contains(characterSequence)
方法无法实现这一点,因为字符序列必须是连续的。但是,下面的工作代码应该可以解决您的问题

for(String fName: fullnames)
        {
            int i;
            for(i =0 ; i< names.size() ;i++)
            {
                String mName = names.get(i);
                String namePart[] = mName.split("\\s+");
                if(namePart.length > 1)
                {
                    int j = fName.indexOf(namePart[0]);
                    if( j > -1 && fName.indexOf(namePart[1], j+namePart[0].length()) > -1)
                        break;

                }
            }

            if(i < names.size())
            {
                System.out.println("removing "+names.remove(i));;

            }
        }

        System.out.println(names);
for(字符串fName:fullnames)
{
int i;
对于(i=0;i1)
{
int j=fName.indexOf(namePart[0]);
如果(j>-1&&fName.indexOf(namePart[1],j+namePart[0].length())>-1)
打破
}
}
如果(i
使用
String.contains(characterSequence)
方法无法实现这一点,因为字符序列必须是连续的。但是,下面的工作代码应该可以解决您的问题

for(String fName: fullnames)
        {
            int i;
            for(i =0 ; i< names.size() ;i++)
            {
                String mName = names.get(i);
                String namePart[] = mName.split("\\s+");
                if(namePart.length > 1)
                {
                    int j = fName.indexOf(namePart[0]);
                    if( j > -1 && fName.indexOf(namePart[1], j+namePart[0].length()) > -1)
                        break;

                }
            }

            if(i < names.size())
            {
                System.out.println("removing "+names.remove(i));;

            }
        }

        System.out.println(names);
for(字符串fName:fullnames)
{
int i;
对于(i=0;i1)
{
int j=fName.indexOf(namePart[0]);
如果(j>-1&&fName.indexOf(namePart[1],j+namePart[0].length())>-1)
打破
}
}
如果(i
但是对象没有contains方法,eclipse建议强制转换process1。这不起作用,因为对象进程没有方法
。contains()
字符串。contains()
将返回
false
,如果字符串由中间名示例分隔。完全同意,即将编辑,在你们爆发之前,但对象没有contains方法,eclipse建议转换process1。这不起作用,因为对象进程没有方法
。contains()
String。contains()
将返回
false
,如果字符串由中间名示例分隔。完全同意,即将编辑,在你们爆发之前,