从列表中获取重复的元素

时间:2013-03-23 10:33:22

标签: java

我需要从数据库中获取重复次数超过3次的元素。这是我的代码如何执行此操作:

    public static ArrayList<Integer> getPrice(List<Integer> list) {
    ArrayList<Integer> result = new ArrayList<Integer>();
    int val;
    HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
    for (int i = 0; i < list.size(); i++) {
        val = list.get(i);
        if (!map.containsKey(val)) {
            map.put(val, 1);
        } else {
            map.put(val, map.get(val) + 1);
        }
    }
    for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
        if (entry.getValue() > 3) {
result.add(entry.getKey());
        }
    }
    return result;
}

这是好的有效方式吗?

2 个答案:

答案 0 :(得分:1)

如果你在数据库中获得列表,我会建议你使用SQL。但是如果你想在java中这样做,你可以这样做:

public static List<Integer> getPrice(List<Integer> list) {
    SetUniqueList<Integer> result = new SetUniqueList<Integer>();
    for (Integer number : list) {
        int occurrences = Collections.frequency(list, number); 
        if (occurrences > 3) {
            result.add(number);
        }
    }
    return result;
}

或者没有org.apache.commons.collections.list:

public static List<Integer> getPrice(List<Integer> list) {
    Set<Integer> aSet = new HashSet<Integer>();
    for (Integer number : list) {
        if (Collections.frequency(list, number) > 3) {
            aSet.add(number);
        }
    }
    List<Integer> result = new ArrayList<Integer>();
    result.addAll(aSet);
    return result;
}

答案 1 :(得分:0)

可以有更有效的解决方案,但如果你考虑运行时它应该没问题。实际上,你有2个for循环,其中具有较大计数的那个占主导地位,这导致O(n),其中n是较大数组的元素的数量。 这是一个很好的运行时。