我有一些元素列表。
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
我该如何有效地做到这一点?
答案 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[] value
和int[]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;
......
转换为list
和value
,您只需进行两次二进制搜索,即可在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);
}
}