我已经搜索了几个SOF线程,但似乎无法找到我正在寻找的答案。他们中的大多数提供的代码答案超出了我迄今为止学到的范围。
我尝试了很多不同的东西,但却无法按照我需要的方式工作。
该程序应该采用给定的数组,读取它,找到给定的toRemove项,然后在没有toRemove项的情况下重新打印数组。
我相信我的问题属于removeFromArray方法
git diff --stat
这是我的java课程中的作业,我们还没有学习列表(我在Google搜索中偶然发现的答案之一),但这对我来说不是一个选择。
就像现在一样,应输出: [这是,例如,电话]
目前正在输出: [this,is,null,example of of]
非常感谢任何和所有帮助!
答案 0 :(得分:5)
在第二个循环中需要2个索引,因为您正在迭代两个具有不同长度的数组(输入数组和输出数组)。
此外,newLength
是一个令人困惑的名称,因为它不包含新的长度。它包含输入数组长度和输出数组长度之间的差异。您可以更改其值以匹配其名称。
int newLength = arr.length;
for(int i = 0; i < arr.length; i++)
{
if(arr[i].contains(toRemove))
{
newLength--;
}
}
String[] result = new String[newLength];
int count = 0; // count tracks the current index of the output array
for(int i = 0; i < arr.length; i++) // i tracks the current index of the input array
{
if(!arr[i].contains(toRemove)) {
result[count] = arr[i];
count++;
}
}
return result;
答案 1 :(得分:0)
以下代码会删除所有提供的字符串。
请注意,我添加了几行来验证输入,因为如果我们将null数组传递给您的程序,它将失败。您应该始终验证代码中的输入。
public static String[] removeFromArray(String[] arr, String toRemove) {
// It is important to validate the input
if (arr == null) {
throw new IllegalArgumentException("Invalid input ! Please try again.");
}
// Count the occurrences of toRemove string.
// Use Objects.equals in case array elements or toRemove is null.
int counter = 0;
for (int i = 0; i < arr.length; i++) {
if (Objects.equals(arr[i], toRemove)) {
counter++;
}
}
// We don't need any extra space in the new array
String[] result = new String[arr.length - counter];
int resultIndex = 0;
for (int i = 0; i < arr.length; i++) {
if (!Objects.equals(arr[i], toRemove)) {
result[resultIndex] = arr[i];
resultIndex++;
}
}
return result;
}
答案 2 :(得分:0)
@Eran在您的代码中指出了错误,这可以解决您的问题。但我将讨论另一种方法。
现在,您首先遍历整个数组以查找要删除的事件数,然后,您将迭代数组以删除它们。你为什么不迭代数组,只是为了删除它们。 (我知道,你的第一个循环正在帮助你确定输出数组的大小,但如果你使用-1**2
之类的Inductive DataType : Type := Text | Decimal | Whole.
Inductive Numeric : DataType -> Type :=
decimal_numeric : Numeric Decimal
| whole_numeric : Numeric Whole.
Inductive Expr : DataType -> Type :=
add ty : Numeric ty -> Expr ty -> Expr ty -> Expr ty.
等,则不需要这样做。)
List
你可以返回ArrayList
,但是如果你真的需要返回一个数组,你可以将List<String> resultList = new ArrayList<String>();
for(int i = 0; i < arr.length; i++)
{
if(!arr[i].contains(toRemove))
{
resultList.add(arr[i]);
}
}
转换为这样的数组:
resultList
然后返回此数组。实时查看此方法here on ideone。
答案 3 :(得分:0)
试试这个Java8版本
List<String> test = Arrays.asList("this", "is", "the", "example", "of", "the", "call");
test.stream()
.filter(string -> !string.equals("the"))
.collect(Collectors.toList())
.forEach(System.out::println);
答案 4 :(得分:0)
您可以使用Java Stream,它会为您提供预期的结果,而且您的代码也会更清晰,更小。
请参阅我写的解决您问题的方法。
public static String[] removeFromArray(String[] arr, String toRemove) {
return Arrays.stream(arr)
.filter(obj -> !obj.equals(toRemove))
.toArray(String[]::new);
}
如果您不熟悉java Stream,请参阅doc here