比较2个字符串,看看它们是否包含公共项目

时间:2014-01-30 15:37:46

标签: java string list boolean compare

说我有2个字符串, Boolean hasName = false;

String employeeNames = "lee,anne,peter,sam,paul";
String managerNames = "ken,lee,sue,tim,alex";

那么,迭代2个字符串并找出两个字符串包含“lee”的最佳方法是什么,那么我可以设置

hasName = true;

这些只是一个简单的样本..我不想要回答如employeeNames.contains(“lee”)或类似的东西,因为我在真实产品中的数据都是动态的,可以是非常长的字符串...我不会知道我得到了什么,但一旦我收到2串,我需要找出他们至少有一个共同项目或不... 这个algrothoim最好的方法是什么? 还有一件事,字符串中的项目都是“,” 所以我能做什么? 感谢

5 个答案:

答案 0 :(得分:2)

您可以使用Sets的重复数据删除属性来比较两个名称列表的内容:

public static boolean hasNames(String s1, String s2) {
    List<String> s1List = Arrays.asList(s1.split(","));
    List<String> s2List = Arrays.asList(s2.split(","));
    HashSet<String> names = new HashSet<>(s1List);
    names.addAll(s2List);
    return names.size() < s1List.size() + s2List.size();
}

说明:如果两个列表中的名称不同,它们都将被添加到集合中,因此集合的大小将等于两个列表的总和。但是,如果它们有一个或多个常用术语,则该集将擦除它们,因此包含的元素少于两个列表的总和。

另外,HashSet正在使用哈希码,这使得它们比使用列表的contains()(在O(N)中)快得多。

答案 1 :(得分:1)

这有复杂度O(N * M),其中N和M是两个字符串中的字符串数

public Boolean hasNames(String s1, String s2){
    List<String> s1List = Arrays.asList(s1.split(","));
    List<String> s2List = Arrays.asList(s2.split(","));

    for(String s : s1List)
        if(s2List.indexOf(s)>=0)
            return true;
    for(String s : s2List)
        if(s1List.indexOf(s)>=0)
            return true;
    return false;
}

另一个选择

public Boolean hasNames(String s1, String s2){
    Set<String> s1Set = new HashSet<String>();
    List<String> s2List = Arrays.asList(s2.split(","));
    for(String s : s1.split(","))
        s1Set.add(s);
    s1Set.retainAll(s2List);
    return !s1Set.isEmpty();
}

答案 2 :(得分:1)

尝试这样的事情:

public static boolean hasName()
{
    boolean value = false;
    String[] empArr = employeeNames.split(",");
    String[] manArr = managerNames.split(",");

    for (int i = 0; i < empArr.length; i++)
    {
        String s = empArr[i];

        for int j = 0, j < manArr.length; j++)
        {
            String t = manArr[j];
            if (s.equals(t)) { value = true; }
        }
    }

    return value;
}

这会遍历两个列表并尝试查找第一个和第二个列表中的内容!

答案 3 :(得分:1)

使用StringTokenizer类拆分第一个字符串中的所有单词,并将它们全部插入HashSet中。 对于第二个字符串,检查hashSet中是否有任何单词。该代码的复杂性为O(max(N,M))〜= O(N)。

String employeeNames = "lee,anne,peter,sam,paul";
String managerNames = "ken,lee,sue,tim,alex";
boolean hasName = false;

HashSet<String> hash = new HashSet<>();
StringTokenizer st1 = new StringTokenizer(employeeNames);
while (st1.hasMoreTokens()) {
    hash.add(st1.nextToken());
}

StringTokenizer st2 = new StringTokenizer(managerNames);
while (st2.hasMoreTokens()) {
    if (hash.contains(st2.nextToken())) {
        hasName = true;
        break;
    }
}

答案 4 :(得分:1)

public Boolean hasNames(String s1, String s2){
  List<String> s1List = Arrays.asList(s1.split(","));
  List<String> s2List = Arrays.asList(s2.split(","));
  HashSet set=new HashSet(s1List);
  set.retainAll(s2List);
  return !set.isEmpty();
}

复杂度为O(M * ln(N))。