1

我正在做一个关于设置交集的 codeeval 练习题。我认为网站期望输入和输出的方式故意使之复杂化。

问题的具体部分是取两组(实际上是字符串数组,确切的问题在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 代码不是特别满意,即使它有效并且这没有还没有。

任何方向表示赞赏。

4

3 回答 3

3

使用TreeSets 和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();
于 2012-08-30T11:21:51.463 回答
1

据我了解你的问题 - 你有这样的字符串:

[1, 2, 3,4]

你想让它看起来像这样:

1,2,3,4

试试这个正则表达式 - 它匹配所有[ , ]空格

String common = bothSets[0].replaceAll("(\\[|\\]| )", "");
于 2012-08-30T11:16:07.440 回答
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]

    }
}

我假设列表不包含重复项。

于 2012-08-30T11:39:35.027 回答