我正在编写一个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”。但正如你可以看到的结果,它应该只在开始时消除沉默。
谢谢大家!
答案 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]