我在codeeval上做了一个关于set intersection的问题。网站的方式 期待输入&我认为输出是故意令人费解的。
问题的具体部分是两个集合(字符串数组真的,确切问题在http://codeeval.com/open_challenges/30/),找到它们的交集,按顺序打印它们,逗号分隔。我已经使用TreeSet解决了它,但它有点复杂和过于复杂,现在我试图使用正则表达式使它更清洁。
我发现了这个 -
String common = bothSets[0].replaceAll("[^" + bothSets[1] + "]", "");
关于堆栈溢出的另一个问题。它留下了引号,我试图用
来修复int subIndex = 0;
while(common.charAt(subIndex) == ',')
subIndex++;
System.out.println(common.substring(subIndex, common.length()));
除了小字符串大小或空字符串大小等边缘情况外,哪些方法有效,然后它会爆炸。我认为修复正则表达式并完全避免使用while循环会更简洁,但我不知道如何在上面的正则表达式中添加“删除引导逗号”。
最后,我的原始解决方案就在这里 - http://pastebin.com/10NuBevB - 我是正确的看待正则表达式方法之类的替代方案,我对这个pastebin代码并不特别满意,即使它有效但这不是然而。
任何方向赞赏。
答案 0 :(得分:3)
使用TreeSet
和retainAll
方法可能是计算实际交叉点的最明确方法。你可以通过在两个原始字符串上并行运行的两个正则表达式匹配器来做一些聪明的事情(利用你知道输入集已经排序的事实)但这可能是一个优化得太远 - 保持简单明了,除非你知道(来自分析)代码需要优化。
我唯一的评论是,您生成输出的代码相当复杂,如何自己构建输出而不是后期编辑toString
:
Iterator<String> iter = a.iterator();
if(iter.hasNext()) {
// first entry with no comma
System.out.print(iter.next());
}
while(iter.hasNext()) {
// subsequent entries with a preceding comma
System.out.print(",");
System.out.print(iter.next());
}
System.out.println();
答案 1 :(得分:1)
据我了解你的问题 - 你有这样的字符串:
[1, 2, 3,4]
你想让它看起来像这样:
1,2,3,4
试试这个正则表达式 - 它匹配所有 [,] 和空格:
String common = bothSets[0].replaceAll("(\\[|\\]| )", "");
答案 2 :(得分:1)
TreeSet版本的变体:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
public class MyTest {
public static List<String> getDuplicates(List<String> dups) {
final List<String> result = new ArrayList<String>();
Set<String> set = new TreeSet<String>() {
public boolean add(String s) {
if (contains(s)) {
result.add(s);
}
return super.add(s);
}
};
for (String t : dups) {
set.add(t);
}
return result;
}
public static void main(String[] args) {
String input = "7,8,9;8,9,10,11,12";
String numbers = input.replace(';', ',');
List<String> elements = Arrays.asList(numbers.split(","));
System.out.println(getDuplicates(elements)); //[8, 9]
}
}
我认为列表不包含重复项。