说我有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最好的方法是什么? 还有一件事,字符串中的项目都是“,” 所以我能做什么? 感谢
答案 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))。