如何更改数组,使重复元素只显示一次?

时间:2014-07-08 21:02:30

标签: java arrays

这与仅删除重复项(您可以使用LinkedHashSet执行)略有不同。如果我在Java中有一个这样的数组,我从byte[]数组获得然后转换为String数组:

[0,0,0,0,1,1,1,1,0,0,0,0,2,2,2,2,3,3,3,3,0,0,0,0]

有没有办法将其改为:

[0, 1, 0, 2, 3, 0]

我尝试使用HashSetLinkedHashSet,但它没有按照我的意愿行事。即使它们在技术上是重复的,也会保留不同的0组。非常感谢!

2 个答案:

答案 0 :(得分:2)

您可能希望遍历元素并将非连续复制元素复制到新集合中:

public class Tester {

    public static void main(String[] args){
         int[] values = {0,0,0,0,1,1,1,1,0,0,0,0,2,2,2,2,3,3,3,3,0,0,0,0};

         List<Integer> output = new ArrayList<Integer>();
         if(values.length > 0){
            int previous = values[0];
            output.add(previous);
            for(int value : values){
                if(previous != value){
                    output.add(value);
                }
                previous = value;
            }
         }
         System.out.println(output); // [0, 1, 0, 2, 3, 0]
    }
}

答案 1 :(得分:0)

扫描输入数组并仅发出每个序列的第一个值。这个伪C#算法应该指导你:

int[] a = ... // input array
int[] b = new int[a.Length]; // same size
int i, j;

if (a.Length == 0)
{
    // return a zero-length array
}

i = 0;
j = 0;
while (i < a.Length)
{
    b[j] = a[i];
    while(i < a.Length && a[i] == b[j])
    {
        i++;
    }
    j++;
}

// return the sub-array of "b" from "0" to "j - 1"

这就是全部。