Java:比较两个字符串数组并删除两个数组中存在的元素

Java:比较两个字符串数组并删除两个数组中存在的元素,java,arrays,string,Java,Arrays,String,这主要是一个性能问题。我有一个字符串数组AllUids中存在的所有用户的主列表。我还有一个字符串数组EndUids中存在的所有结束日期用户的列表 我在Java中工作,我的目标是从主列表AllUids中删除结束日期数组中存在的所有用户。我知道PHP有一个名为array_diff的函数 我很好奇Java是否有什么东西可以比较两个数组并删除两个数组中相似的元素。我的目标是这里的性能,这就是为什么我问一个内置函数。我不想添加任何特殊的包 我曾考虑过写一个递归函数,但似乎效率很低。两个列表中都有数千个用户

这主要是一个性能问题。我有一个字符串数组AllUids中存在的所有用户的主列表。我还有一个字符串数组EndUids中存在的所有结束日期用户的列表

我在Java中工作,我的目标是从主列表AllUids中删除结束日期数组中存在的所有用户。我知道PHP有一个名为array_diff的函数

我很好奇Java是否有什么东西可以比较两个数组并删除两个数组中相似的元素。我的目标是这里的性能,这就是为什么我问一个内置函数。我不想添加任何特殊的包

我曾考虑过写一个递归函数,但似乎效率很低。两个列表中都有数千个用户。为了存在于结束日期列表中,您必须存在于AllUids列表中,直到删除为止

例如:

String[] AllUids = {"Joe", "Tom", "Dan", "Bill", "Hector", "Ron"};

String[] EndUids = {"Dan", "Hector", "Ron"};
我正在寻找的功能:

String[] ActiveUids = AllUids.RemoveSimilar(EndUids);
ActiveUID将如下所示:

{"Joe", "Tom", "Bill"}
Set<String> activeUids = new HashSet<String>(Arrays.asList(activeUidsArray));
谢谢大家,, 显然,我可以想出循环之类的方法,但我不相信它会有效率。这是每天在生产机器上运行的东西。

有一个名为removeAll的类和一个名为removeAll的静态方法,该方法获取初始列表和要从该列表中删除的内容列表:

Collection removeAll(Collection collection,
                     Collection remove)
如果您使用用户列表而不是数组,那么这应该可以满足您的需要。使用Arrays.asList()可以很容易地将数组转换为列表,因此

EDIT:我还对Commons集合进行了一些挖掘,并在Commons集合中找到了ListUtils的以下解决方案:

List diff = ListUtils.subtract(Arrays.asList(AllUids), Arrays.asList(EndUids));
非常整洁…

您不能从数组中“删除”元素。可以将它们设置为null,但数组的大小是固定的

您可以使用
java.util.Set
removeAll
将一个集合从另一个集合中移除,但我更喜欢使用:

Set allUids=Set.newHashSet(“乔”、“汤姆”、“丹”,
“比尔”、“赫克托”、“罗恩”);
Set endUids=Sets.newHashSet(“Dan”、“Hector”、“Ron”);
Set activeUids=Set.difference(allUids、endUids);

这有一种更具功能性的感觉。

您可以将这些字符串放在一个集合中,然后使用removeAll方法。

最简单的解决方案可能是将所有元素放在一个集合中,然后使用removeAll。可以从如下数组转换为集合:

{"Joe", "Tom", "Bill"}
Set<String> activeUids = new HashSet<String>(Arrays.asList(activeUidsArray));
Set-activeUids=newhashset(Arrays.asList(activeUidsArray));

尽管您确实应该尽量避免使用数组而偏爱集合。

不要为此使用数组,请使用集合和方法。至于性能:除非你做了一些愚蠢的事情,导致了O(n^2)运行时,否则就忘了它。这是过早的优化,无用的/有害的。“成千上万的用户”算不了什么,除非你每秒都在做成千上万次

顺便说一句,PHP“数组”实际上是散列映射。

/*
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Bireswhar
 */
import java.util.Collection;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Repeated {

    public static void main(String[] args) {
//        Collection listOne = new ArrayList(Arrays.asList("milan","dingo", "elpha", "hafil", "meat", "iga", "neeta.peeta"));
//        Collection listTwo = new ArrayList(Arrays.asList("hafil", "iga", "binga", "mike", "dingo"));
//
//        listOne.retainAll( listTwo );
//        System.out.println( listOne );

        String[] s1 = {"ram", "raju", "seetha"};
        String[] s2 = {"ram"};
        List<String> s1List = new ArrayList(Arrays.asList(s1));
        for (String s : s2) {
            if (s1List.contains(s)) {
                s1List.remove(s);
            } else {
                s1List.add(s);
            }
             System.out.println("intersect on " + s1List);
        }
    }
}
*要更改此模板,请选择工具|模板 *然后在编辑器中打开模板。 */ /** * *@author Bireswhar */ 导入java.util.Collection; 导入java.util.ArrayList; 导入java.util.array; 导入java.util.List; 公共课重复{ 公共静态void main(字符串[]args){ //Collection listOne=新的ArrayList(Arrays.asList(“米兰”、“野狗”、“埃尔法”、“哈菲尔”、“肉”、“iga”、“尼塔.皮塔”)); //Collection listwo=newarraylist(Arrays.asList(“hafil”、“iga”、“binga”、“mike”、“dingo”)); // //列表一。保留(列表二); //System.out.println(listOne); 字符串[]s1={“ram”、“raju”、“seetha”}; 字符串[]s2={“ram”}; List s1List=newarraylist(Arrays.asList(s1)); for(字符串s:s2){ 如果(列表包含){ s1.删除列表; }否则{ s1.添加列表; } System.out.println(“在“+s1List”上相交); } } }
字符串s1=“a,b,c,d”;
字符串s2=“x,y,z,a,b,c”;
Set set1=新的HashSet();
Set set2=新的HashSet();
Set set11=新的HashSet();
字符串[]splitS1=s1.split(“,”);
字符串[]splitS2=s2.split(“,”);
用于(字符串s3:splitS1){
set1.添加(s3);
set11.添加(s3);
}
用于(字符串s4:splitS2){
set2.添加(s4);
}
set1.移除所有(set2);
set2.移除所有(set11);
set1.addAll(set2);
系统输出打印项次(set1);

这种方法有一点让人惊讶,那就是
设置.difference
返回一个视图。如果您确实希望
activeUids
成为一个“正常的”
集(即:如果
allUids
endUids
发生变化,其值不会改变,并且调用
size()
是O(1)),您可能应该立即将Set.difference的结果传递给构建集的某个对象。例如:
Sets.newHashSet(Sets.difference(a,b))
CollectionUtils对我不起作用,但如果我调用ActiveUids.removeall(EndUids),它就工作得很好。我最终改变了存储字符串的方式。我使用以下命令创建了一个hashset:hashset-ActiveUids=newhashset();谢谢大家的帮助。这正是我要找的!它可以在Android上使用吗只有嘲笑的回答是不鼓励的。最好解释一下这个代码片段为什么以及如何解决这个问题
    String s1 = "a,b,c,d";
    String s2 = "x,y,z,a,b,c";
    Set<String> set1 = new HashSet<String>();
    Set<String> set2 = new HashSet<String>();

    Set<String> set11 = new HashSet<String>();

    String[] splitS1 = s1.split(",");
    String[] splitS2 = s2.split(",");

    for(String s3:splitS1){
        set1.add(s3);
        set11.add(s3);
    }

    for(String s4:splitS2){
        set2.add(s4);
    }
    set1.removeAll(set2);
    set2.removeAll(set11);
    set1.addAll(set2);
    System.out.println(set1);