【问题标题】:I am in need of a method of storing many different items in a list我需要一种在列表中存储许多不同项目的方法
【发布时间】:2011-10-11 20:56:43
【问题描述】:

我有一个用 java 编写的程序,迫切需要优化。现在我有 3 个 ArrayLists 我想简化为 1 个列表类型的东西。我有一个 ArrayList 用于矩形,一个用于布尔值,一个用于我用我的一个类创建的对象。我们现在可以称它为“项目”。我将三个 ArrayList 保持在相同的顺序,对它们都做同样的事情。例如,每次我创建一个新项目时,我将它添加到项目 ArrayList,我向该 ArrayList 添加一个布尔值,并将一个矩形添加到第三个 ArrayList。 我正在寻找解决方案。我尝试了 HashMaps,但每个列表项只获取 2 条信息。有一次,我尝试了一个 ArrayList,但处理起来非常痛苦。如果有人可以帮助我找到解决方案,我将不胜感激。非常感谢。

编辑:感谢所有快速回答

【问题讨论】:

  • 正在创建一个复合对象,其中包含项目、矩形和布尔值,而不是选项
  • 为什么需要优化,问题出在哪里,检索数据还是存储需要时间?
  • 代码更长,更乱,写起来很烦。

标签: java arrays list object hash


【解决方案1】:

您需要一个数据类,其中包含三个对象作为字段,并列出数据对象。
像这样的:

public class ItemData {
    private final Item item;
    private final boolean flag;
    private final Rectangle rectangle;
    private ItemData(Item item, boolean flag, Rectangle rectangle) {
        this.item = item;
        this.flag = flag;
        this.rectangle = rectangle;
    }
    public Item getItem() {
        return item;
    }
    public boolean isFlag() {
        return flag;
    }
    public Rectangle getRectangle() {
        return rectangle;
    }
}
public static void main(String[] args) {
    List<ItemData> list = new ArrayList<ItemData>();
}

哦...也许他们会为即将到来的第二、第三等奖品:)

【讨论】:

    【解决方案2】:

    如果没有更多背景信息(例如列表中的项目之间的关系),很难说,但我猜如果合适的话,你可以用简单的方法来做:

    创建一个将矩形和布尔值作为实例变量的对象。

    如果您觉得这不合适,您可以在另一个哈希表中嵌套一个哈希表,但我不一定建议这样做,因为它会给您的程序增加不必要的复杂性。

    【讨论】:

    • 好的,谢谢。它似乎 java 会有类似的东西,但我想他们没有理由应该这样做。
    【解决方案3】:

    我立即想到的唯一事情就是做一个引用布尔值、矩形和其他对象的对象。

    【讨论】:

      【解决方案4】:

      为什么不将三个相关联的项目存储在一个类中,然后列出它们?

      class MyThingy {
          public MyItem item;
          public boolean flag;
          public Rectangle rect;
      }
      
      List<MyThingy> myList = new ArrayList<MyThingy>();
      

      根据需要调整 public/private 和 getter/setter。

      【讨论】:

        【解决方案5】:

        编写一个新类,其中包含“矩形”、布尔值和“项目”作为字段,并将该类的实例存储在单个列表中。

        例如:

        public class MyRecord {
            private Rectange rectangle;
            private boolean flag;
            private Item item;
        
            // getters / setters
        }
        

        然后在你的其他班级(无论你有你的名单):

        ...
        List<MyRecord> list = ...; // initialize or obtain from somewhere
        list.get(0).setFlag(false); // modify field within your container object
        

        【讨论】:

        • 如此简单但出于某种原因我没想到。出于好奇,有没有内置的方法来处理这样的事情?
        • @Joe 实际上没有什么“内置”的——主要是因为创建一个像上面这样的容器类很简单。好吧,理论上你可以做一个 Map 实例列表,但性能和可读性都远非理想的解决方案
        猜你喜欢
        • 2012-08-14
        • 1970-01-01
        • 2017-09-11
        • 1970-01-01
        • 2013-12-08
        • 1970-01-01
        • 1970-01-01
        • 2011-11-23
        • 1970-01-01
        相关资源
        最近更新 更多