检查list2.containsAll(list1)是否与完全相同的String

时间:2017-05-19 11:30:07

标签: java collections

我有List1和List2,如果List1中的所有字符串都以类似的形式存在(见下文),我希望收到true。

现在的问题是,

List1:
1. iscat
2. ishooman
3. isdoge

List2:
1. is_Cat
2. is_Hooman
3. is_doge

逻辑上,函数list2.containsAll(list1)返回false,因为字符串不相等。

我如何检查类似的字符串?我能想到正则表达式,但我现在脑子里还没有明确的术语,我也不知道如何在Java中使用Regex。

谢谢

5 个答案:

答案 0 :(得分:3)

commons-collections4有一个CollectionUtils.isEqualCollection()方法,使用Equator(类似于equals()方法)作为输入。

你可以生成一个赤道来使这些字符串相同,然后调用isEqualCollection()

    Equator<String> equator = new Equator<String>() {
        @Override
        public boolean equate(String o1, String o2) {
            if  (StringUtils.equalsIgnoreCase(o1.replaceAll("_", ""), o2.replaceAll("_", ""))) {
                return true;
            } else {
                return false;
            }
        }

        @Override
        public int hash(String o) {
            return HashCodeBuilder.reflectionHashCode(o.replaceAll("_", "")).toLowerCase();
        }
    };
    List<String> a = new ArrayList<>();
    List<String> b = new ArrayList<>();
    a.add("iscat");
    b.add("is_Cat");
    System.out.println(CollectionUtils.isEqualCollection(a, b, equator));

还有一个类似的CollectionUtils.removeAll()函数。我只是看到你只需要containsAll(),所以你可以使用removeAll。如果在删除所有B之后没有留下任何内容,我们可以看到B包含所有A。

答案 1 :(得分:0)

Theres是GitHub上的一个API,它可以检查字符串的相似性,你可以使用它!

认为Jaro-Winkler实现了相似度和距离算法(?)。检查此示例:

import info.debatty.java.stringsimilarity.*;

public class MyApp {


    public static void main(String[] args) {
        JaroWinkler jw = new JaroWinkler();

        // substitution of s and t
        System.out.println(jw.similarity("My string", "My tsring"));

        // substitution of s and n
        System.out.println(jw.similarity("My string", "My ntrisg"));
    }
}

输出:

  

0.9740740656852722

     

0.8962963223457336

您可以在列表中进行迭代,调用此lib,然后保存结果以便稍后进行比较

java-string-similarity

答案 2 :(得分:0)

那么,你可以检查每个字符串是否包含来自另一个列表的字符串中的所有字母(在单向包含中):

for(int i = 0; i<list1.size();i++){
    if(Collections.contains(list1.get(i).toLowerCase().toCharacterArray(),list2.get(i).toLowerCase().toCharacterArray())
     || Collections.contains(list2.get(i).toLowerCase().toCharacterArray(),list1.get(i).toLowerCase().toCharacterArray())){
        //then they are similar

    }
}

检查其中一个字符串的字符数组是否包含在另一个字符串中。

答案 3 :(得分:0)

尝试这样的事情:

List<String> l1 = Arrays.asList("iscat", "ishooman", "isdoge");
List<String> l2 = Arrays.asList("is_Cat", "is_Hooman", "is_doge");

System.out.println(l2.stream().map(s->s.toLowerCase().replace("_", "")).collect(Collectors.toList()).containsAll(l1));

上面的代码使用流将字符串映射到所需的格式:s->s.toLowerCase().replace("_", "")。如果有更多更改,您可以为其添加更多逻辑。

希望这有帮助!

答案 4 :(得分:0)

想象一下你把list2的一个元素,把它变成小写并删除_,然后检查list1中是否存在,现在如果你用list2中的所有元素重复它并过滤那个列表那么就会发生两件事情:

  1. 结果列表的大小与list1相同:表示所有List2元素都在list1
  2. 结果列表的大小与list1不同:表示list1中至少有一个元素不在list1中
  3. List<String> myList = Arrays.asList("iscat", "ishooman", "isdoge");
    List<String> myList2 = Arrays.asList("is_Cat", "is_Hooman", "is_Doge");
    List<String> myListResult = new ArrayList<>(myList);
    myListResult = myList2.stream().filter(x -> myList.contains(x.toLowerCase().replace("_", "")))
            .collect(Collectors.toList());
    
    System.out.println(myListResult.size() == myList.size());