替代(?)Java解决方案|数组列表

时间:2015-04-12 15:15:45

标签: java

我正在编写一个Java代码,它应该删除arraylist中的所有“0”并返回一个相同的新列表,但没有“0”。

举个例子:

public static void main(String[] args) {
    int[] sound = {0, 0 , 0, 0, -14, 120, 67, -234, -15, -389, 289, 178, -437, 33, 15, 0, 0, -32, 230, 368};
    int[] result = trimSilenceFromFront(sound);
    System.out.println(Arrays.toString(result));
}

应该是:

[-14, 120, 67, -234, -15, -389, 289, 178, -437, 33, 15, 0, 0, -32, 230, 368]

我做了这段代码:

import java.util.*;

public class NoZero {
    public static int[] trimSilenceFromFront(int[] samples) {
        int[] newArrayList = new int[samples.length];

        for (int i = 0; i < samples.length; i = i + 1) {
            if (samples[i] != 0) {
                newArrayList.add(samples);
            }
        }
        return newArrayList;   
    }
}

当我看到他们在循环与for循环混合时所拥有的答案。但是因为解决这个问题的方法不止一种:我的代码错了吗?

更新:我误解了这个问题。我认为它应该删除所有“0”。但正如你可以看到的结果,它应该只在开始时消除沉默。

谢谢大家!

4 个答案:

答案 0 :(得分:1)

您必须找到第一个非零值并从该索引中复制到结尾。有很多方法可以做到这一点,例如:

public static int[] trimSilenceFromFront(int[] samples) {
    int i = 0;
    while (i++ < samples.length) {
        if (samples[i] != 0) {
            break;
        }
    }
    return Arrays.copyOfRange(samples, i, samples.length);
}

答案 1 :(得分:0)

有无限的方法可以解决Java问题。单个解决方案的可行性可以用不同的方式来衡量。

我发现最大的测量是代码可读性,可维护性,内存使用和执行速度。考虑您的要求,并尝试平衡这些衡量标准。

答案 2 :(得分:0)

@Bubletan的解决方案到目前为止效率更高。

如果你想要另一个解决方案,你也可以使用LinkedList:

private static Integer[] trimSilenceFromFront(Integer[] samples) {
    LinkedList<Integer> soundList = new LinkedList<Integer>(Arrays.asList(samples));
    boolean soundStarted = false;
    while(!soundStarted && soundList.size()>0){
        if(soundList.peekFirst()!=null && soundList.peekFirst()==0){
            soundList.removeFirst();
        }
        else {
            soundStarted=true;
        }
    }
    return soundList.toArray(new Integer[0]);
}

答案 3 :(得分:0)

修改

没关系,这可以从范围中修剪所有沉默,而不仅仅是从前方。很抱歉,您的问题和代码互相矛盾。


我猜这是一个混乱的解决方案,但可能会引导你走上正确的道路

        int[] sound = {0, 0 , 0, 0, -14, 120, 67, -234, -15, -389, 289, 178, -437, 33, 15, 0, 0, -32, 230, 368};

        ArrayList<Integer> temp = new ArrayList<Integer>();

        for(int i = 0; i < sound.length; i++) {
            if(sound[i] != 0) {
                temp.add(sound[i]);
            }
        }

        int[] trimmedSound = new int[temp.size()];

        for(int i = 0; i < temp.size(); i++) {
            trimmedSound[i] = temp.get(i);
        }
        System.out.println(Arrays.toString(sound));
        System.out.println(Arrays.toString(trimmedSound));
    }

这是输出

[0, 0, 0, 0, -14, 120, 67, -234, -15, -389, 289, 178, -437, 33, 15, 0, 0, -32, 230, 368]
[-14, 120, 67, -234, -15, -389, 289, 178, -437, 33, 15, -32, 230, 368]