Java:从现有的String Array中删除一个项目

时间:2017-11-02 06:02:48

标签: java arrays string methods

我已经搜索了几个SOF线程,但似乎无法找到我正在寻找的答案。他们中的大多数提供的代码答案超出了我迄今为止学到的范围。

我尝试了很多不同的东西,但却无法按照我需要的方式工作。

该程序应该采用给定的数组,读取它,找到给定的toRemove项,然后在没有toRemove项的情况下重新打印数组。

我相信我的问题属于removeFromArray方法

git diff --stat

这是我的java课程中的作业,我们还没有学习列表(我在Google搜索中偶然发现的答案之一),但这对我来说不是一个选择。

就像现在一样,输出: [这是,例如,电话]

目前正在输出: [this,is,null,example of of]

非常感谢任何和所有帮助!

5 个答案:

答案 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