将元素添加到列表中

时间:2014-04-30 08:08:52

标签: java arrays algorithm list

我有一些元素列表。

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

假设列表包含如下值:

0,0,0,0,0,1,1,1,1,2,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4

如何在每个组之前添加一个虚拟元素(例如-1)作为分隔符?他的结果应该是

-1,0,0,0,0,0,-1,1,1,1,1,-1,2,2,2,2,2,-1,3,3,3,3,3,3,3,3,-1,4,4,4,4,4,4,4

我该如何有效地做到这一点?

5 个答案:

答案 0 :(得分:2)

修改

方法1:

重写 add() 功能。

List<Integer> list = new ArrayList<Integer>(){
    public boolean add(Integer add){
    if(super.size()==0 || super.get(super.size()-1)!=add)
        super.add(-1);
    super.add(add);
    return true;
    }
};

现在list.add(number);将覆盖add函数并添加另一个整数(ie-1),只要它发现最后一个元素的值发生了变化。

方法2

以传统方式。迭代结束并在找到更改时添加-1

List<Integer> list = new ArrayList<Integer>();
        list.addAll(Arrays.asList(0,0,0,0,0,1,1,1,1,2,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4));  
        int last=-1;
        for(int i=0;i<list.size();i++){
            if(list.get(i)!=last){
                last=list.get(i);
                list.add(i, -1);
                ++i;
            }
        }

答案 1 :(得分:1)

您只需要跟踪以前的值并遍历列表。

List<Integer> origList = getListHowever();
List<Integer> spacedList = new ArrayList<Integer>();
int bufferElement = -1;
int currVal;
int lastVal = Integer.MIN_VALUE;  // or some default value that is unlikely to be in the list

for (int i=0; i<origList.size(); i++) {
    currVal = origList.get(i);
    if (lastVal != currVal) {
        spacedList.add(bufferElement);
    }
    spacedList.add(currVal);
    lastVal = currVal;
}

当项目添加到原始列表时,可以遵循相同的方法。跟踪最后添加的值或查看最后一个元素。

答案 2 :(得分:0)

使用链接哈希映射,对数组进行循环,将数字作为键,将频率作为值。 根本不需要放置分隔符。

答案 3 :(得分:0)

如果您只需要知道每个组中元素的值和数量,则可以使用两个数组。例如,如果您有n个不同的不同值(或n组),则可以使用数组int[] valueint[]count,其中value[i]是第i个组的值,{{1} }是第i组中的元素数。

所以在你的情况下:

count[i]

要从int [] value = new int[5]; int [] count = new int[5]; value[0] = 0; count[0] = 5; value[1] = 1; count[1] = 4; ...... 转换为listvalue,您只需进行两次二进制搜索,即可在count中查找特定值的开始和结束索引(如果list已排序)。所以时间复杂度为O(nlog m),其中m是list的大小。

正如Zoyd在评论中提到的那样,我们也可以使用list来存储元素对的值和数量,或HashMap <Integer,Integer>来维护他们的排序顺序。

答案 4 :(得分:0)

这是我的解决方案,以防重复整数排序。

排序重复整数示例:

0,0,0,1,1,1,2,2,3,3,3,3,4,4,4

<强>代码

class FrequencyOrderedSet
{
    LinkedHashMap<Integer,Integer> list;

    public FrequencySet()
    {
        list = new LinkedHashMap<Integer,Integer> ();
    }

    public void insert (Integer number)
    {
        if (list.constainsKey(number))
            list.put(number, list.get(number)+1);
        else
            list.put(number, 1);
    }

    public void remove (Integer number)
    {
        if (list.containsKey(number))
            if (list.get(number) > 1)
                list.put(number, list.get(number)-1);
            else
                list.remove(number);
    }

    public ArrayList getList ()
    {
        ArrayList out = new ArrayList<Integer> ();

        for (Integer num : list.getKeyList())
            for (int i=0; i<list.get(num); i++)
                out.add(num);
    }
}