java新手-列出重复项的代码需要优化
以下代码执行以下操作:对于“a”中的每个元素,查找其在元素“b”中是否具有匹配项:java新手-列出重复项的代码需要优化,java,android,Java,Android,以下代码执行以下操作:对于“a”中的每个元素,查找其在元素“b”中是否具有匹配项: String a[] = new String[]{"a","b","c"}; String b[] = new String[]{"e","f","a","a"}; String hold=""; for (int i = 0; i < a.length; i++){ for (int k = 0; k < b.length; k++){ if ( a[i].equals( b[
String a[] = new String[]{"a","b","c"};
String b[] = new String[]{"e","f","a","a"};
String hold="";
for (int i = 0; i < a.length; i++){
for (int k = 0; k < b.length; k++){
if ( a[i].equals( b[k]) ){
hold+=a[i];
}//if
}//for
}//for
stringa[]=新字符串[]{“a”、“b”、“c”};
字符串b[]=新字符串[]{“e”、“f”、“a”、“a”};
字符串hold=“”;
for(int i=0;i
问题是,有时数组“b”可能包含重复项,但我们不希望
要记录在变量“hold”中的重复项
以下是我尝试过的方法-将所有匹配项保存到哈希集,然后使用containsKey()首先
检查它是否在hashset中,如果不在,则更新'hold'变量。还尝试在数组中记录每个匹配项,并在更新“hold”变量之前首先检查此数组
还有别的办法吗?有没有更好的方法来实现这一点?添加一个中断,以便在获得匹配的对象后立即离开
for (int k = 0; k < b.length; k++){
if ( a[i].equals( b[k]) ){
hold+=a[i];
break;
}//if
}//for
for(int k=0;k
编辑:
如果你想阻止另一个也这样做:
start:
for (int i = 0; i < a.length; i++){
for (int k = 0; k < b.length; k++){
if ( a[i].equals( b[k]) ){
hold+=a[i];
break start;
}//if
}//for
}//for
开始:
for(int i=0;i
编辑
如果您想确保不会获得“a”副本,请执行以下操作:
String a[] = new String[]{"a", "b", "c"};
String b[] = new String[]{"e", "f", "a", "a"};
List<String> matches = new ArrayList<String>();
String hold = "";
for (String anA : a)
if (!matches.contains(anA))
for (String aB : b)
if (anA.equals(aB))
{
hold += anA;
matches.add(anA);
}//if
}//for
}//for
stringa[]=新字符串[]{“a”、“b”、“c”};
字符串b[]=新字符串[]{“e”、“f”、“a”、“a”};
列表匹配项=新的ArrayList();
字符串hold=“”;
对于(字符串anA:a)
如果(!matches.contains(anA))
用于(字符串aB:b)
如果(anA.等于(aB))
{
hold+=anA;
匹配。添加(anA);
}//如果
}//为了
}//为了
你应该考虑使用你的HOLD变量以不包含重复,并使用<代码> RealObjult<代码>方法来获得集合和另一个集合之间的交集(可以包含重复)。
< P>我将它们转换成列表并用于查找匹配。然后只需循环hold变量的列表。使用此方法,您不必担心b中的重复项。Retainal不会在意它在b中出现两次。它将保留a,因为它存在于b中。数组中剩下的任何内容都将连接到您的控制中
String a[] = new String[]{"a","b","c"};
String b[] = new String[]{"e","f","a","a"};
//get new ArrayList because asList is immutable
List<String> aList = new ArrayList(Collections.asList(a));
List<String bList = Collections.asList(b);
aList.retainAll(bList);
StringBuilder sb = new StringBuilder();
for(String s : aList) {
sb.append(s);
}
String hold = sb.toString();
stringa[]=新字符串[]{“a”、“b”、“c”};
字符串b[]=新字符串[]{“e”、“f”、“a”、“a”};
//获取新的ArrayList,因为asList是不可变的
列表列表=新的数组列表(Collections.asList(a));
列表使用集合将自动删除重复项
Set< String > mySet1 = new HashSet< String >(Arrays.asList(a));
Set< String > mySet2 = new HashSet< String >(Arrays.asList(b));
SetmySet1=newhashset(Arrays.asList(a));
SetmySet2=newhashset(Arrays.asList(b));
mySet1
或mySet2
将不包含任何重复项。
根据您的示例,mySet1
将是{a”,“b”,“c”}
,mySet2
将是{e”,“f”,“a”}
在这一点之后,您可以使用多种方法来获取您想要检查文档的位置。
我相信您正在寻找removeAll函数。我看到您正在做的是,您有两个包含内容的数组。我知道内容将来会有所不同。每次遍历数组A的1个字符时,都要测试数组B的值是否相等。如果是这样,您希望在数组/字符串保持中存储该值一次
如果该值已经存在,为什么不直接签入保持,如果不存在,则添加它,如果存在,则跳过它
PS:很抱歉,我没有在评论中这样做,但我没有足够的代表对问题本身发表评论。使用java.util.List很简单:
List<String> listB = new LinkedList();
for(int i = 0; i < b.lenght; i++) listB.add(b[i]);
for(int i = 0; i < a.lenght; i++) {
if(listB.contains(a[i])) hold+=a[i];
}
List listB=newlinkedlist();
对于(inti=0;i
是的,这基本上就是我前面提到的代码片段。gj:)编辑了我的答案。添加一个标签并打破您定义的标签。此外,如果您要检查“a”中是否也有重复项,则a for不是最佳解决方案,您应该使用其他人已经在此处显示的其他解决方案:)您的第二个解决方案不起作用,例如:字符串a[]=新字符串[]{“c”、“a”、“a”、“e”};字符串b[]=新字符串[]{“a”,“c”};输出仅为c。哪个是错的