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