1

我需要从数据库中获取重复超过 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;
}

是不是又好又有效的方法?

4

2 回答 2

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;
}
于 2013-03-23T10:51:14.987 回答
0

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

于 2013-03-23T10:46:28.593 回答