【问题标题】:How do you delete the first few items from an array of strings?如何从字符串数组中删除前几项?
【发布时间】:2011-09-18 23:08:23
【问题描述】:

我有一个方法,它接收一个字符串数组并根据长度找到每几个项目的平均值。我想要根据偏移量的值删除数组中前几项的方法。

public static double[] getMovingAverage(String[] priceList, int length, int offset){

    double[] newPriceList = convert(priceList);

    int listLength = newPriceList.length;
    int counter = 0;
    double listsum;
    double[] movingAverage = new double[listLength];

    try{
        for (int aa = 0; aa < listLength-1; aa++){
            listsum = 0;
            for (int bb = 0; bb < length; bb++){
                counter = aa+bb;

                listsum = listsum + newPriceList[counter];
            }
            movingAverage[aa] = listsum / length;
        }
        if (offset>0){

                        //remove first #offset# elements

        }
    }catch(Exception e){
        System.out.println(e);
    }
    return movingAverage;
}

*注意:转换();将 String[] 转换为 double[]

【问题讨论】:

    标签: java arrays string arraylist boolean


    【解决方案1】:

    Java 中的数组是固定长度的。 (你不能改变数组的长度。)

    但是,您可以创建一个新数组,其中第一个 offset 元素很容易被移除:

    double[] movingAverage = { 0.1, 0.2, 1.1, 1.2 };
    int offset = 2;
    
    // print before
    System.out.println(Arrays.toString(movingAverage));
    
    // remove first offset elements
    movingAverage = Arrays.copyOfRange(movingAverage, offset, movingAverage.length);
    
    // print after
    System.out.println(Arrays.toString(movingAverage));
    

    输出:

    [0.1, 0.2, 1.1, 1.2]
    [1.1, 1.2]
    

    【讨论】:

      【解决方案2】:

      来自 Java 6 API

      公共静态双精度[] copyOfRange(double[] original, 来自, 转)

      复制指定范围的 指定数组到一个新数组中。这 范围(从)的初始索引必须 介于零和 original.length 之间, 包括的。原始值[来自] 被放入初始元素 副本(除非来自 == original.length 或从 == 到)。价值观 从后面的元素 原始数组被放入 副本中的后续元素。这 范围 (to) 的最终索引,其中 必须大于或等于 from, 可能大于 original.length, 在这种情况下 0d 被放置在所有 其索引为的副本的元素 大于或等于 original.length - 从。的长度 返回的数组将是 to - from。

      参数: original - 来自的数组 要从哪个范围复制 - 范围的初始索引是 复制,包括到 - 最终索引 要复制的范围,独占。 (该索引可能位于 数组。)

      返回:一个新数组 包含指定范围 原始数组,截断或 用零填充以获得 所需长度

      抛出: ArrayIndexOutOfBoundsException - 如果 从 original.length() IllegalArgumentException - 如果来自 > 到 NullPointerException - 如果是原始的 为空因为: 1.6

      【讨论】:

      • 这是一个很好的答案;太糟糕了,在搜索“shift Java array”时没有找到它——也许这条评论在这方面会有所帮助?
      【解决方案3】:

      为什么不直接创建一个较小的新列表作为输出,而不是删除项目,并始终使用 index-offset 作为其中的索引?

      【讨论】:

      • 是的。并在您使用时将 aa 初始化为偏移量。
      【解决方案4】:

      【讨论】:

        【解决方案5】:

        您不能从数组中显式删除,但可以使用其他数据结构(如 ArrayList)来累积结果。但是,在您的情况下,您可能只想更改代码以正确调整数组的大小。

         double[] movingAverage = new double[listLength-offset];
        

            for (int aa = 0; aa < listLength-offset; aa++){
        

        【讨论】:

        • 如果你想这样做,你需要从 offset 而不是 0 开始你的 for 循环,你需要遍历第一个 offset 元素来计算它们的总和,否则您对运行平均值的计算将不正确
        【解决方案6】:

        为了防止复制数组,您可以使用像 LinkedList 这样的集合类,它具有 O(1) 的头部删除操作。

        http://download.oracle.com/javase/6/docs/api/java/util/LinkedList.html

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-02-10
          • 1970-01-01
          • 2021-01-21
          • 2021-12-28
          • 1970-01-01
          • 1970-01-01
          • 2015-09-27
          相关资源
          最近更新 更多