【问题标题】:Not able to iterate items from itemSet无法从 itemSet 中迭代项目
【发布时间】:2012-08-26 14:56:57
【问题描述】:

大家无法从ItemSet 迭代或获取项目,以下是我的代码

物品类

public class Item {

    private String id; 
    private int count;
    private String  name;

    public int getcount() {
       return this.count; 
    }

    public Item(String name) {
        this.name=name;
        this.id = "";
    }

    public Item(String id, String name) {
        this.name=name;
        this.id=id;
    }

    public Item(int count) {
        this.count=count;
    }

    public String getItemName() {
        return this.name;
    }

    public String getItemId() {
        return this.id;
    }

    public Item returnItems(ItemSet itemset) {
        Item item=null;
        return item;
    }

}

ItemSet 类保存项目列表

public  class ItemSet   {

    private List<Item> hold;

    ItemSet(Item item) {
        hold = new ArrayList<Item>();
        this.hold.add(item); 
    }

    ItemSet() {
        //throw new UnsupportedOperationException("Not yet implemented");
    }   

    public List<Item> getItemSet() {
        return this.hold;
    }    

    public void addItems(Item item) {
        hold = new ArrayList<Item>();
        this.hold.add(item);
    }

}

这是我的 Transaction 类包含 ItemSets 列表

public class Transaction  {

    private List<ItemSet> trans;

    public ItemSet getUniqueItem() {
        ResultSet rs;
        Database d=new Database();
        ItemSet unique=new ItemSet();
        String query="Select id,name from item";
        rs=d.sendQuery(query);
        try{  
            while(rs.next()) {
                System.out.println(rs.getString(1)+"\t"+rs.getString(2));
                Item item=new Item(rs.getString(1),rs.getString(2));
                unique.addItems(item);      
            } 
        } catch(Exception e) { 
            System.out.print(e.getMessage());
        }
        return unique;
    }

}

这是我的主要课程

public class Ap {

    public static void main(String args[]) {
        Transaction t=new Transaction();
        Transaction Ci=new Transaction();
        Transaction Li=new Transaction();

        ItemSet I=t.getUniqueItem();    //11
    }
}

我不知道如何在 11 时从 ItemSet 中获取项目

我尝试过使用

foreach(Item i:I) {

}

但我遇到了错误。

【问题讨论】:

  • 你遇到了什么错误?
  • 使用“set”这个词对键的迭代具有令人困惑的含义......我会使用不同的词,但这与您的问题无关。
  • 嗯,你创建了很多项目列表。就像每次添加项目一样。可能是个问题。保存ItemSets 列表而不是只有一个列表的目的是什么?
  • 错误命名的“addItems”,(它需要一个项目)总是会清除现有列表并用一个包含单个项目的新列表替换它。
  • @SteveH。是的,可能是从初始化构造函数中复制/粘贴的。

标签: java


【解决方案1】:

为了能够使用for (Item i : itemSet),您的ItemSet 类必须实现iterable 接口。您可以通过将以下方法添加到 ItemSet 类来做到这一点:

public Iterator<Item> iterator() {
    return hold.iterator();
}

请记住,您应该将implements Iterable&lt;Item&gt; 添加到类声明中。

请注意,您始终可以使用for (Item i : itemSet.getItemSet())

【讨论】:

  • 实际上我想要 itemSet 中的项目,因为我正在向其中添加项目 itemSet.getItemSet() 将返回 ItemSet
  • itemSet.getItemSet() 返回包含所有项目的列表,对吗?该列表本身实现了可迭代接口,因此您可以使用 foreach 循环遍历它。这样,ItemSet 就不必实现 Iterable 接口了。
  • 我只得到最后一项 I4 而不是全部,即 I1,I2,I3
  • 你为什么要这么做?这只是开销......您已经拥有的列表有一个迭代器。检查我在下面的回答。
  • 在事务类中,正在从 db 中检索项目,将它们添加到项目集并返回到 main。我在 db 中有 4 个项目,这意味着我应该得到所有 4 个项目,但我只得到 I4 温我使用以下代码进行迭代 for(Item i:I) { System.out.println(i.getItemId()+ ":"+ i.getItemName()); }
【解决方案2】:

为了使用'foreach'语句,你的ItemSet类应该实现java.lang.Iterable接口

更新:

看这个SO answer关于如何实现Iterable接口

【讨论】:

  • 好的,我应该如何使用它,请告诉我已经完成了这个@Override public Iterator iterator() { throw new UnsupportedOperationException("Not supported yet."); }
  • 请看我上面的更新,这样的答案应该适合你。
【解决方案3】:

Transaction 类中的getUniqueItem() 方法返回一个ItemSet,它没有实现Iterable 接口,所以你不应该期望能够迭代它。您需要通过调用getItemSet()ItemSet 获取List&lt;Item&gt; 并对其进行迭代。

顺便说一句,getItemSet() 可能不是该方法的好名字,因为它返回一个 List&lt;Item&gt;

【讨论】:

  • 我无法从事务类中迭代项目集我按如下方式实现了迭代器 @Override public Iterator iterator() { Iterator itemList = trans.iterator();返回项目列表; }
【解决方案4】:

我认为你的代码没有多大意义,我真的不明白为什么每个人都想实现 Iterator 接口。

首先,您为包含列表的类使用名称 Set。 然后在 addItems() 方法中重新创建 List 的一个新实例,它应该是 addItem() 因为您想将单个项目添加到您的列表中。

您所做的基本上是制作一个列表并向其中添加一个项目,但是您添加的下一个项目会重新创建列表,并将它的引用分配给上一个列表的引用,从而有效地删除它。 所以你的列表永远不会包含超过 1 项。

如果你想让一个列表作为一个类的属性,那么类的名称你就很直观,例如 ItemList 因为这告诉你你有一个项目列表和这正是它的本质。 但是,如果它只包含一个列表,那么实际上根本不需要它,因为您唯一要做的就是在两者之间添加一个方法调用。您可以只使用 List 接口或任何实现它的类,例如 ArrayList。

我拿走了你的代码并重写了它,让它变得有意义。 希望对你有帮助;)

public class Transaction  {

    public ItemList getUniqueItems() {

        Database d = new Database();
        ItemList unique = new ItemList();
        String query="Select id,name from item";
        ResultSet rs = d.sendQuery(query);
        try {  
            while(rs.next()) {
                System.out.println(rs.getString(1)+"\t"+rs.getString(2));
                unique.addItem(new Item(rs.getString(1),rs.getString(2)));      
            } 
        }
        catch(Exception e){
            System.out.print(e.getMessage());
        }
        return unique;
    }

}

public class Ap {

    public static void main(String args[]) {
        Transaction t  = new Transaction();

        ItemList i = t.getUniqueItems();  
        List<Item> list = i.getItemList();
        list.get(10);    //11 because 0 counts also
    }
}

较短的版本是: 1:交易类

public class Transaction  {

    public List<Item> getUniqueItems() {

        Database d = new Database();
        List<Item> unique = new ArrayList<Item>();

        String query="Select id,name from item";
        ResultSet rs = d.sendQuery(query);
        try {  
            while(rs.next()) {
                System.out.println(rs.getString(1)+"\t"+rs.getString(2));
                unique.add(new Item(rs.getString(1),rs.getString(2)));      
            } 
        }
        catch(Exception e){
            System.out.print(e.getMessage());
        }
        return unique;
    }

}

2:Ap 类:

public class Ap {

    public static void main(String args[]) {
        Transaction t  = new Transaction();
        List<Item> list = t.getUniqueItems();
        list.get(10);    //11 because 0 counts also

                // iteration with a foreach loop
                for (Item i : list) {
                   System.out.println(i);
                }

                // iteration with a for loop 
                for (int n = 0, s = list.size(); n < s; n++) {
                    System.out.println(list.get(n));
                }

                // iteration with a Iterator
                Iterator<Item> iterator = list.iterator();
                while (i.hasNext()) {
                    System.out.println(i.next());
                }
    }
}

所以完全不需要在任何地方实现 Iterator 接口。

【讨论】:

  • 比原来的好多了......我仍然发现方法名称“getUniqueItems”具有误导性。
  • 你能告诉我如何从交易中获取ItemList
  • 对不起,我编辑了它。变量 i 不再存在。所以改为 t,即包含 getUniqueItems() 方法的事务。
  • @jonathan.cruz 谢谢我做了以下 List list = t.getUniqueItems(); for(Item i:list) { ItemList itemList=new ItemList(i); Ci.addTransaction(itemList);现在我想遍历 Ci 并将项集发送到 Transaction 中的计数函数请帮助我,我无法迭代
  • 编辑了我的答案并添加了几种方法来做你想做的事。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
  • 2021-11-08
  • 2014-10-26
相关资源
最近更新 更多