【问题标题】:Removing the last element of an ArrayList删除 ArrayList 的最后一个元素
【发布时间】:2017-03-08 18:55:53
【问题描述】:

我是 Java 新手,一个多星期以来一直在尝试解决一个练习,但我不知道自己做错了什么。

我需要删除 ArrayList 的最后一个元素,在本例中为整数。

问题是当我运行测试时,它仍然返回旧值。

public static void removeLastOccurrence(int x, ArrayList<Integer> list) {
    if (list != null && !list.isEmpty()) {
       list.remove(list.size()-1);
    }
}

我也尝试过使用 list.remove(list.lastIndexOf(x));

但是当我运行这个测试时它仍然返回相同的列表。

public class UTest{
    @Test
    public void testMultipleLast() {
        ArrayList<Integer> input = new ArrayList<Integer>(asList(1,1,3,5,7,1,5,9,1));
        ArrayList<Integer> result = new ArrayList<Integer>(asList(1,1,3,5,7,1,5,9));
        Solution.removeLastOccurence(1, input);
        assertEquals(result, input);
    }
}

如果有人可以帮助并告诉我我缺少什么,那就太好了,因为我觉得我只是缺少一小部分拼图,这让我感到非常沮丧。

【问题讨论】:

  • 您在哪里尝试删除您的元素?我没有看到任何删除?
  • 你的测试应该调用你正在测试的方法吧?!
  • list.get(list.size()-1) 没有删除任何东西,它返回最后一个元素
  • 在调用assertEquals()之前,你必须先调用removeLastOccurrence(1, input);

标签: java arraylist integer lastindexof


【解决方案1】:

您的测试应该如下所示。在原始帖子的测试代码中,您实际上并没有调用您要测试的方法。

public class UTest
{
  @Test
  public void testMultipleLast() {
     ArrayList<Integer> input = new ArrayList<Integer>(asList(1,1,3,5,7,1,5,9,1));
     ArrayList<Integer> result = new ArrayList<Integer>(asList(1,1,3,5,7,1,5,9));

     // int x = ?
     ArrayList<Integer> actual = SomeClass.removeLastOccurrence(x, input)
     assertEquals(result, actual);
  }
 }

removeLastOccurrence() 方法可以做到以下几点

if(list != null && !list.isEmpty()){
    list.remove(list.size() - 1);
}

【讨论】:

  • 我又删除了一行,因为它返回错误,有人建议我删除它(您可以在我的原始帖子中看到)。但据我所知,我不必更改测试代码,因为它只是为了查看代码是否正确。
【解决方案2】:

这是因为您没有删除任何元素。

list.get(list.size()-1);

不删除元素。

使用

list.remove(list.size()-1)

改为。

【讨论】:

  • 是的,是的。我猜是错字。删除也不起作用。
【解决方案3】:

根据Java ArrayList APIget(int index) 方法,您只需获取ArrayList 中index 位置的元素。 这是您正在寻找的方法:

public static void removeLastOccurrence(int x, ArrayList<Integer> list) {
    if (list != null && !list.isEmpty()) {
        list.remove(list.size()-1);
    }
}

【讨论】:

    【解决方案4】:

    你必须使用:

    list.remove(list.size()-1);
    

    并返回您的新列表,以便您可以使用:

    public static ArrayList<Integer> removeLastOccurrence(int x, ArrayList<Integer> list) {
        if (list != null && !list.isEmpty()) {
           list.remove(list.size()-1);
        }
        return list;
    }
    

    【讨论】:

      【解决方案5】:

      如果你将你的列表作为参数传递给方法,它就会变成一个局部变量。因此,您不会从input 列表中删除元素,而只是从局部变量list 中删除元素。解决方案是 return 您方法中的本地列表或使用相同代码直接从您的“输入”列表中 remove 元素。您原始方法中的 x 参数是不必要的。

      【讨论】:

      • 这根本不是真的。对对象的引用作为值传递,但对象本身的属性仍然可以更改。对input 的更改会同时反映到inputlist
      • @mc-emperor 我同意input 上的更改将反映在两者上,但不会反映在对立面。 list 上的更改只是 removeLastOccurrence 方法的本地更改。这就是为什么在这种情况下,input 数组在调用 removeLastOccurrence 方法后仍然相同。
      • 它们都被改变了,因为两个变量都指向同一个对象。 list 上的更改不是局部于 removeLastOccurrence 方法。请参阅the Java Tutorial,尤其是“传递引用数据类型参数”部分。
      • 引用类型技巧!谢谢你。我应该测试并检查“已编辑”问题的代码(而不是假设它仍然无法工作),因为它实际上以现在的方式工作。
      猜你喜欢
      • 2012-02-25
      • 1970-01-01
      • 2014-08-28
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      相关资源
      最近更新 更多