删除数组中的连续重复值 - Arduino / Java

时间:2015-02-02 14:51:07

标签: java arrays arduino

我正在使用Ardunio,但很高兴使用Java解决方案,因为这可能有助于我理解。

我有一个长度为50的数组stateX[],它将保存类似于:

的值
0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, -1, -1, 0, 1, 1......

我想知道如何从数组中删除重复的值,这些值是 next 。因此输出将变为具有元素的较小数组:

0, 1, 0, -1, 0, 1

显然这个较小的阵列会改变大小,所以我不确定。以及如何检测重复值。

帮助表示感谢,谢谢

3 个答案:

答案 0 :(得分:0)

我不知道"系统"方法论,但这是你可以做到的一种方式:

int[] array = new int[]{1,0,0,1,1,1,-1,-1,1,-1};
List<Integer> lst = new ArrayList<Integer>();

lst.add(array[0]);

for(int i=1;i<array.length;i++)
{
    if(array[i]!=lst.get(lst.size()-1)) lst.add(array[i]);
}

int lstSize = lst.size();
int[] revisedArray = new int[lstSize];
for(int i = 0; i < lstSize; i++) revisedArray[i] = lst.get(i);

答案 1 :(得分:0)

以下解决方案可以就地工作,并且不使用任何Java列表,这两个特性在移植到Arduino / C时都很有帮助。它的复杂度为O(a.length)。

请注意,由于未调整输入/输出数组的大小,并且删除了值,因此结果太大。返回值newSize表示解决方案的长度,即在调用方法后,只有a中的第一个newSize值是相关的。

public static int removeAdjacentDuplicates(int[] a) {
    int newSize = 1;
    for (int i = 1; i < a.length; i++) {
        // check if the current value differs from the preceding one
        if (a[i] != a[i - 1]) {
            a[newSize++] = a[i];
        }
    }
    return newSize;
}

答案 2 :(得分:0)

抱歉,我不知道Arduino,但是我用Java编写了以下课程,这是非常自我解释的,希望这可能会有所帮助,不要犹豫,提出任何问题!:

package test;

import java.util.ArrayList;
import java.util.Random;

public class Duplicates {

    static ArrayList<Integer> ints = new ArrayList<Integer>();

    public static void main(String[] args) 
    {

        //Creating an arrayList with random numbers from 0 to 5, note that it will work with any numbers.
        for(int index = 0 ;  index <= 1000 ; index++)
        {
            Random myRandom = new Random(); 
            int x = (int) (myRandom.nextDouble() * 5); 
            ints.add(x);

        }

        //Calling my method to remove dupliates next to another
        ArrayList<Integer> cleanedList = removeNextToAnotherDuplicates(ints);

        //Displaying it in the console
        System.out.println(cleanedList.toString());

    }

    public static  ArrayList<Integer> removeNextToAnotherDuplicates(ArrayList<Integer> list)
    {

        for(int i = 0 ; i < list.size() ; i++)
        {
            boolean continueFlag = true;

            // j = j because I do not want to always increment my position, since I would skip some due to the fact that I remove duplicates
            for( int j = i + 1; j < list.size() && continueFlag ; j = j)
            {
                //Showing each iterations.
                System.out.println("i("+ i +") :" + list.get(i).intValue() + "   j("+ j +") :" + list.get(j).intValue());

                if(list.get(i).intValue() == list.get(j).intValue())
                {
                    list.remove(j);
                }
                else
                {
                    continueFlag = false;
                    j++;
                }

                //Showing each iterations.
                System.out.println("flag: "+ continueFlag);
                System.out.println(list.toString());

            }
        }

        return list;
    }
}