【问题标题】:Remove In Range in an ArrayList在 ArrayList 中删除范围内
【发布时间】:2014-03-10 02:10:43
【问题描述】:

我有以下要求来编写一个java方法。 编写一个名为removeInRange 的方法,它接受四个参数:整数列表、元素值、起始索引和结束索引。该方法的行为是删除在起始索引(包括)和结束索引(不包括)之间的列表中出现的所有给定元素。出现在给定索引范围之外的其他值和给定值的出现不受影响。

例如,对于列表 (0, 0, 2, 0, 4, 0, 6, 0, 8, 0, 10, 0, 12, 0, 14, 0, 16),调用 removeInRange( list, 0, 5, 13) 应该产生列表 (0, 0, 2, 0, 4, 6, 8, 10, 12, 0, 14, 0, 16)。请注意,位于原始列表(在进行任何修改之前)中 5(含)和 13(不含)之间的索引处的零已被删除。 我写的方法如下:

public static void removeInRange(List<Integer> list,int value,int beg,int end)
{
    beg=new Integer(beg);
    //Integer b=beg;
    int count=0;
    list.subList(5, 13);
/*  for( Integer b:list.subList(beg, end))

    {
        if(list.get(b)==value)
        list.remove(b);
    }
    */
    Iterator<Integer> iter = list.subList(beg, end).iterator();
    int i=iter.next();
    while(iter.hasNext())
    {
        if (iter.next().intValue()==value) 
        {
            iter.remove();

        }

    }

    System.out.println(list);
}

但是,此方法在线程“main”java.lang.UnsupportedOperationException 中给了我错误异常。我想要任何提示或建议如何更改我的方法以避免此异常?

【问题讨论】:

标签: java core


【解决方案1】:

一种解决方法是创建一种支持删除的新型列表,例如 LinkedList,将列表中的元素复制到 LinkedList,执行操作,然后返回 LinkedList。

【讨论】:

    【解决方案2】:

    我认为您使用的List 类型不支持remove()

    List<Integer> list = Arrays.asList(new Integer[]{0, 0, 2, 0, 4, 0, 6, 0, 8, 0, 10, 0, 12, 0, 14, 0, 16});
    removeInRange(list, 0, 5, 13);
    

    会给你例外,但是:

    List<Integer> list = new ArrayList<Integer>(Arrays.asList(new Integer[]{0, 0, 2, 0, 4, 0, 6, 0, 8, 0, 10, 0, 12, 0, 14, 0, 16}));
    removeInRange(list, 0, 5, 13);
    

    不会。

    这是因为Arrays.asList() 返回一个不支持remove() 操作的List 的实现,而是抛出一个UnsupportedOperationException,而java.util.ArrayList 支持它。

    你有两个解决这个问题的方法:

    • 返回一个新的List,它是传入参数列表的副本,减去您要删除的内容:public static List&lt;Integer&gt; removeInRange(List&lt;Integer&gt; list,int value,int beg,int end)
    • 当作为参数给出的列表不支持remove() 时抛出UnsupportedOperationException,并让调用者看看该怎么做。

    【讨论】:

      【解决方案3】:

      您可能会使用下面的 sn-p 之类的东西。请记住,您正在更改您正在迭代的列表...所以使用正确的东西来控制您需要检查多少次删除整数值.

      public static void removeInRange(List<Integer> list, int value, int beg,int end)
      {
          int n = end - beg;
          int i = beg;
          for (int j = 0; j < n; j++) {
              if (list.get(i) == value) {
                  list.remove(i);
              } else {
                  i++;
              }
          }
      }
      

      【讨论】:

      • 这个逻辑不会抛出 ConcurrentModificationException 因为你同时修改和从列表中删除?
      • 仅删除项目。列表确实发生了变化,但我们在开始之前计算了多少检查。
      【解决方案4】:

      为什么不只是这个?:

      public void removeInRange(List<Integer> list, int element, int startInd, int endInd) {
          for (int i = endInd - 1; i >= startInd; i--) {
              if (list.get(i) == element) {
                  list.remove(i);
              }
          }
      }
      

      【讨论】:

        【解决方案5】:
        public static void removeInRange(List<Integer> list, int value, int beg,int end)
        {
            for (int i = beg; i < end; i++) {
                if (list.get(i) == value) {
                    list.remove(i);
                    i--;
                    end--;
                }
            }
        }
        

        【讨论】:

        • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-02-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多