2016-01-12 3 views
0

Привет всем, мой вопрос немного легкоРазность множеств

public static Set<String> edits(String word) { 
    Set<String> edits = new HashSet<String>(); 
    List<SplitWord> splits = SplitWord.allSplits(word); 
    for (SplitWord split: splits) { 
     String a = split.prefix; 
     String b = split.suffix; 
     int lb = b.length(); 
     if (lb > 0) { 
      edits.add(a + b.substring(1)); // delete 
      for (int i = 0; i < ALPHABET.length(); ++i) 
       edits.add(a + ALPHABET.charAt(i) + b.substring(1)); // replace 
     } 
     if (lb > 1) 
      edits.add(a + b.charAt(1) + b.charAt(0) + b.substring(2)); // transpose 
     for (int i = 0; i < ALPHABET.length(); ++i) 
      edits.add(a + ALPHABET.charAt(i) + b); // insert 
    } 
    return edits; 
} 
public static Set<String> edits2(String word){//Double Edits according to norvig's spell corrector. Recursive way. 
    Set<String> firstSet = new HashSet<String>(); 
    Set<String> secondSet= new HashSet<String>(); 

    firstSet.addAll(edits(word)); 
    for(String w: editsn){ 
      secondSet.addAll(edits(w)); 
      if(secondSet.contains(edits1(word))){ 
       secondSet.remove(w); 
      } 
    } 

    return secondSet; 
} 

Вот мои два метода, мой «редактирует» орфографическая ошибка проверки метод только для одной ошибки орфографии. Например, если вы пишете (atson), он говорит (watson). Я использую функцию «редактирования» рекурсивным способом проверки ошибок двойного заклинания (например, tson to watson). Он работает, но мой второй набор содержит firstSet, поэтому он также печатает также орфографические ошибки. Я пытаюсь удалить элементы, но это не сработает. Итак, как печатать разницу двух наборов? (Математически AB)

+4

[ 'set1.removeAll (SET2)'] (https://docs.oracle.com/javase/7/docs/api/java/util/Set.html#removeAll%28java.util.Collection % 29) – khelwood

ответ

2

Вы можете использовать этот метод набора для разности двух множеств

removeAll(java.util.Collection)

Важное примечание: Это мутирует набор, который вы называете removeAll на

+1

Я мог бы добавить (возможно, очевидную) оговорку, что это мутирует набор, который вы называете 'removeAll', поэтому сначала вы должны сделать копию, если вам нужно содержимое после ... –

+0

В зависимости от _direction_ различия , вам может потребоваться вызвать это оба пути (т.е. элементы в 'a', а не в' b', элементы в 'b' не в' a'). –

1

Пример:

Предположим, у вас есть List, содержащий несколько слов;

// List declaration; 
List<String> words = new ArrayList<String>(); 

// Populate list; 
words.add("one"); 
words.add("two"); 
words.add("three"); 

И у вас есть два комплекта;

// Set declaration; 
Set<String> setA = new HashSet<String>(); 
Set<String> setB = new HashSet<String>(); 

Давайте заполним оба наших набора словами из списка, который мы определили ранее, и добавим исключительное слово к одному из множеств;

setA.addAll(words); 
setB.addAll(words); 
setA.add("four"); 

Теперь мы хотим удалить те элементы, которые в обоих наборах

setA.removeAll(setB); 

вывода результата:

System.out.println(setA); 
+0

Что делать, если мы делаем 'setB.add (" five ")'? –

+0

@BoristheSpider 'setB' добавил бы к нему еще один« String »:) –

+0

Но это элемент, который является« разницей », но в обратном направлении к тому, что вы предполагаете. Это двусторонние отношения; элементы в ни 'a', ни 'b', элементы в 'a', но не в 'b', элементы в 'b', но не в 'a', элементы как в 'a', так и 'b'. Вы смотрите только на элементы 'a', а не на' b', а не на обратный - это моя точка. –

1

Это также очень легко сделать с гуавы, которые большинство людей имеют в своем классе путь в любом случае.

final HashSet<String> set1 = Sets.newHashSet("A", "B"); 
final HashSet<String> set2 = Sets.newHashSet("B", "C"); 
final Sets.SetView<String> difference = Sets.difference(set1, set2); // contains A only 
Смежные вопросы