【问题标题】:How do i remove an array object if the array is not made by an ArrayList? [duplicate]如果数组不是由 ArrayList 创建的,如何删除数组对象? [复制]
【发布时间】:2014-02-08 00:47:30
【问题描述】:

我正在尝试在游戏中移除一颗流星,因为它是一颗子弹,但似乎有错误,我现在没有其他方法来移除该对象。

for (int i = 0; i < numA; i++) {
    if (meteor[i].isVisible())
      meteor[i].move();
    else meteor[i].remove(i);
    }

【问题讨论】:

  • meteor[i].remove(i); 这是在流星对象上调用 remove() 方法,而不是数组。这是你想要的吗?
  • 我正在尝试删除可见为假的流星,一旦它被物体击中

标签: java arrays


【解决方案1】:

您知道,您实际上应该为此使用Set。数组效率太低了。

要做到这一点,而不是声明一个数组:

private Meteor[] meteor = new Meteor[10];

声明一个Set:

private Set<Meteor> meteor = new HashSet<Meteor>();

您可以添加流星:

meteor.add(newMeteor);

并删除它们:

meteor.remove(meteorToRemove);

并检查它们是否在集合中:

if (meteor.contains(met))

并遍历它们:

for (Meteor m : meteor)

【讨论】:

  • 诚然,任何Collection 都有removecontains 方法,而不仅仅是Set。您只有在那时(试图)保证不会将重复的 Meteor 对象放入集合中。不确定这是否是所需的,但要使其发挥最大潜力,equals()hashCode() 必须在 Meteor 中被覆盖。
  • @Makoto 我正在尝试选择最有效的解决方案。 HashSet 将是存储一堆 Meteors 的最有效方式。我不会说要覆盖equalshashCode,因为每个Meteor 都应该被认为是不同的。
  • 如果Meteor 的两个实例哈希到相同的值,它不会像你想象的那样工作。这正是您必须覆盖 hashCode 的原因(并且您确实应该覆盖 equals,因为这是覆盖这两者的一般合同)。高效代码和坏代码是有区别的。
  • @Makoto hashCode 的默认实现使得Meteor 的两个不同实例具有相同值的可能性非常非常小。如果他们这样做,equals 将被覆盖以使用 == 运算符。这不可能有问题。
【解决方案2】:

Apache 在ArrayUtils 中有一个可以提供帮助的公共实用程序方法。它的工作原理是这样的:

array = ArrayUtils.removeElement(meteor, elementToDelete)

查看文档了解更多信息:Apache Docs

【讨论】:

    【解决方案3】:

    仅数组解决方案

    for (int i = 0; i < numA; i++) {
        if (meteor[i].isVisible())
            meteor[i].move();
        else {
            Meteor[] result = new Meteor[meteor.length - 1];
            System.arraycopy(meteor, 0, result, 0, i);
            if (meteor.length != i) {
                System.arraycopy(meteor, i + 1, result, i, meteor.length - i - 1);
            }
            meteor = result;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-10-02
      • 1970-01-01
      • 2018-09-10
      • 2018-12-15
      • 2021-07-24
      • 1970-01-01
      • 2016-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多