2016-12-19 4 views
2

Я ищу лучшее решение для поиска совпадающего набора с максимальным совпадением строк. Вот пример,найти максимальное количество совпадений из нескольких наборов

inSet = ["a","b","c","x"] 

другой список набора

set1 = ["a","d","q","s"] 
set2 = ["a","m","t","b","z"] 
set3 = ["a","x","b","s","r","t"] 

в приведенном выше примере, set3 составляет макс. количество совпадений (3).

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

+2

Какова твоя первоначальная идея? И почему бы (не) быть таким же оптимальным, как вы думаете? Пожалуйста, покажите нам свое решение этой проблемы! – n247s

+0

Для начала вы можете использовать новый Set <> (inSet) .retainAll (set1/set2/set3). –

ответ

2

Давайте Set<String> set и Guava.Sets:

Set<Set<String>> set = new Set<>(); 
//add Set<String>s 
Set<String> maxMatchSet = set.stream() 
           .max(Comparator.comparingInt((value -> Sets.intersection(value, inSet).size())) 
           .get(); 

ОК, теперь немного теории. ["a", "b"] - это не набор, а массив (или список). У нас есть разные структуры данных в Java. Наборы представлены в {}.

В любом случае, имеет значение код.

Set<String> set = new HashSet<>(); 

бы инициализировать Set и

List<String> list = new ArrayList<>(); 

будет инициализировать List. Еще есть другой вариант:

String[] array = new String[3]; 

будет инициализировать новый массив размера 3. Массивы фиксированной длины.

+0

Ваша логика работает, и она возвращает max set. – Bharat

+0

В моем вопросе мое намерение состояло в том, чтобы предоставить набор данных, не смотрел на представление. Спасибо за ваше предложение, я буду осторожнее идти вперед. – Bharat

+0

@Bharat рад это слышать - в большинстве случаев люди не знают Гуаву ... – xenteros