Как определить, содержит ли набор наборов другой набор? - PullRequest
6 голосов
/ 12 декабря 2011

Это странно: A - набор, а B - набор наборов:

Set <String> A=new HashSet<String>();
Set <Set<String>> B=new HashSet<Set<String>>();

Я добавил вещи к ним и вывод

System.out.println(A)

есть:

[evacuated, leave, prepc_behind]

и выход

System.out.println(B)

является:

[[leave,  to, aux], [auxpass,  were, forced], [leave,  evacuated, prepc_behind]]

Как видно, третий элемент множества B равен множеству A. Так что гипотетически

if(B.contains(A)){...}

должен возвращать true, но, очевидно, это не так. В чем проблема?

Подробнее:

 Pattern pattern = Pattern.compile("(.*?)\\((.*?)\\-\\d+,(.*?)\\-\\d+\\).*");
    for (int i = 0; i < list.size(); i++) {
        Set <String> tp = new HashSet<String>();
        Matcher m = pattern.matcher(list.get(i).toString());
        if (m.find()) {
            tp.add(m.group(1).toLowerCase());
            tp.add(m.group(2).toLowerCase());
            tp.add(m.group(3).toLowerCase());
        }
        B.add(tp);
    }
    Set <String> A=new HashSet<String>();
    A.add("leave");
    A.add("evacuated");
    A.add("prepc_behind");
    System.out.println(A);
    if(B.contains(A)){
    System.out.println("B contains A");
}

Ответы [ 2 ]

2 голосов
/ 26 августа 2014

Основная идея (setA.contains(setB) == true), кажется, работает нормально:

    Set<String>      set1 = new HashSet<String>();
    Set<Set<String>> set2 = new HashSet<Set<String>>();
    Set<String>      tmpSet;

    set1.add("one");
    set1.add("three");
    set1.add("two");

    tmpSet = new HashSet<String>();
    tmpSet.add("1");
    tmpSet.add("2");
    tmpSet.add("3");
    set2.add(tmpSet);

    tmpSet = new HashSet<String>();
    tmpSet.add("one");
    tmpSet.add("two");
    tmpSet.add("three");
    set2.add(tmpSet);

    System.out.println(set2.contains(set1)); // true

Я бы рискнул предположить, что вы снимаете больше в своем регулярном выражении, чем вам хотелось бы. Попробуйте преобразовать совпадение из регулярного выражения и тестовой строки в byte[] и сравнить их друг с другом.

0 голосов
/ 12 декабря 2011

Set.contains (other) возвращает true, если элемент принадлежит набору, равно другому.

И Set имеет переопределение equals () и hash (). Set.equals () вернет true, еслиоба набора имеют одинаковые элементы.

Итак, если A2 принадлежит B, а A2 имеет те же элементы, что и A, B.contains (A) вернет true;

...