Java Collection - 顶部和底部n个元素

时间:2012-07-24 18:40:04

标签: java sorting collections filtering

我有一个相当独特的要求,我的收藏中应该只包含顶部和底部n个元素。这些元素具有可比性,并且Collection本身是有界的,这意味着评估是在向Collection添加条目时完成的。

例如,将以下一组值插入“Top and Bottom 10”集合

5,15,10,1,12,8,11,2,16,14,9,3,20,7

收藏品应仅包含以下内容

20,16,15,14,12,7,5,3,2,1

我正在考虑维护2个n / 2元素的SortedSet,然后将它们合并到最后但是方法不干净并且在使用结果之前需要合并步骤。

希望有人能更好地回答这个问题。

2 个答案:

答案 0 :(得分:1)

1。您想要排序和唯一性,请使用TreeSet from java.util.Collection您的数据将按自然顺序自动排序,并且将保持唯一性

2. :根据需要使用Collections.reverse() 撤消收藏 ...

答案 1 :(得分:0)

因为我喜欢在周日下午这样写作收藏,

import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import org.junit.Test;

public class TopBottom {

    public int[] top;
    public int[] bottom;

    public TopBottom(int size) {
        top = new int[size];
        Arrays.fill(top, Integer.MIN_VALUE);
        bottom = new int[size];
        Arrays.fill(bottom, Integer.MAX_VALUE);
    }

    public void add(int element) {
        int n = Arrays.binarySearch(top, element);
        if (n < -1) {
            System.arraycopy(top, 1, top, 0, -2 - n);
            top[-2 - n] = element;
        }
        int m = Arrays.binarySearch(bottom, element);
        if (m < 0 && bottom.length >= -m) {
            System.arraycopy(bottom, -1 - m, bottom, 0 - m, bottom.length + m);
            bottom[-1 - m] = element;
        }
    }

    public void add(int... elements) {
        for (int each: elements) {
            add(each);
        }
    }

    public String toString() {
        StringBuilder buf = new StringBuilder();
        buf.append('[');
        for (int each: bottom) {
            buf.append(each);
            buf.append(", ");
        }
        for (int each: top) {
            buf.append(each);
            buf.append(", ");
        }
        buf.setLength(buf.length() - 2);
        buf.append("]");
        return buf.toString();
    }

    public static class Examples {

        @Test
        public void shouldHoldOnlyTopFiveAndBottomFive() {
            TopBottom tp = new TopBottom(5);
            tp.add(5, 15, 10, 1, 12, 8, 11, 2, 16, 14, 9, 3, 20, 7);
            assertEquals("[1, 2, 3, 5, 7, 12, 14, 15, 16, 20]", tp.toString());
        }

    }

}

它使用Arrays#binarySearch方法,除了查找现有元素之外,如果缺少元素,则将插入点返回到排序列表中。插入点将返回(-1-index),因此检查n m分别是否为-1-n是否为负数,以及后来{{1}}形式的表达式以获取插入点或前后点