Самый быстрый способ сравнить массив значений или список значений - PullRequest
1 голос
/ 13 мая 2010

Подскажите, пожалуйста, о самом быстром и эффективном способе сравнения большого набора значений. Как будто есть список родительских кодов (строка), и каждый код имеет ряд дочерних значений (строка). Дочерние списки должны сравниваться друг с другом, выявлять дубликаты и подсчитывать, сколько раз они повторяются.

code1(code1_value1, code1_value2, code3_value3, ..., code1_valueN);
code2(code2_value1, code1_value2, code2_value3, ..., code2_valueN);
code3(code2_value1, code3_value2, code3_value3, ..., code3_valueN);
    .
    .
    .
codeN(codeN_value1, codeN_value2, codeN_value3, ..., codeN_valueN);

Списки огромны, скажем, есть 100 родительских кодов, в каждом из которых около 250 значений. В списке кодов не будет дубликатов. Делая это в Java, и решение, которое я мог бы выяснить, это.

  • Сохранить значения первого набора кода как codeMap.put(codeValue, duplicateCount). Счет инициализирован до 0.
  • Затем сравните остальные значения с этим. Если его на карте, увеличьте счет, в противном случае добавьте его на карту.

Падением этого является получение дубликатов. Другая итерация должна быть выполнена для очень большого списка.

Альтернативой является сохранение другой хэш-карты для дубликатов, такой как duplicateCodeMap.put(codeValue, duplicateCount), и изменение исходного хеш-карты на codeMap.put(codeValue, codeValue).

Скорость - это то, что является требованием. Надеюсь, один из вас может помочь мне с этим.

1 Ответ

1 голос
/ 13 мая 2010

Вы хотите использовать Map<String,Set<String>>, например, для каждого дочернего кода, какой набор родительских кодов имеет его.

То есть вам нужна Multimap , по сути, доступная из Гуавы.

Вот пример, иллюстрирующий идею:

import java.util.*;
public class MultiMap {
    public static void main(String[] args) {
        String[] codes = {
            "A=1,2,3,4",
            "B=1,3,5,9",
            "C=2,5,7,8",
        };
        Map<String,Set<String>> map = new HashMap<String,Set<String>>();
        Set<String> dupes = new HashSet<String>();
        for (String code : codes) {
            String parent = code.split("=")[0];
            for (String child : code.split("=")[1].split(",")) {
                Set<String> set = map.get(child);
                if (set == null) {
                    map.put(child, set = new HashSet<String>());
                } else {
                    dupes.add(child);
                }
                set.add(parent);
            }
        }
        System.out.println(map);
        // {3=[A, B], 2=[A, C], 1=[A, B], 7=[C], 5=[B, C], 4=[A], 9=[B], 8=[C]}
        for (String child : dupes) {
            System.out.println(child + "=" + map.get(child));
        }
        // 3=[A, B]
        // 2=[A, C]
        // 1=[A, B]
        // 5=[B, C]     
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...