Java嵌套for循环的重复输出

我创建了这个包,问题是何时运行它在bin之间重复相同的目录条目。 我认为问题出在详细的Inventory方法中。 应该是:它应该为Bin B创建一个新的随机bin项(类型,标题,艺术家),而不是使用Bin A中的相同元素。除此之外,输出是正确的。 正确生成并显示SKU编号。

**当i对应目录时,i的值是对象。 它们实际上是不同类型的物理媒体,例如DVD或磁带,具有标题,艺术家和SKU属性。

***虽然它似乎没有意义,但数据应该是随机生成的。 (这个类是一个更大的概念/课程的一部分来说明inheritance。)

任何帮助将不胜感激!

这是我看到的输出:

 Bin A:DVD  -  Greatest Hits Volume 2(Limp Bizkit),SKU 1234-0:500 Cassette  -  The Best Of(Michael Jackson),SKU 1234-1:25 DVD  -  Love Songs(Michael Jackson),SKU 1234-2: 7720 
Bin B:DVD - Greatest Hits Volume 2(Limp Bizkit),SKU 1234-3:1000

Bin B下的bin项不应该与A相同。

public class testMusicMedia { public static ArrayList MakeMusicCatalog( int size ) { String[] titles = { "Greatest Hits Volume 1", "Greatest Hits Volume 2", "The Best Of", "Love Songs", "The Early Years", "The Later Years" }; String[] artists = { "Michael Jackson", "Eminem", "The Beatles", "Shania Twain", "Limp Bizkit" }; ArrayList catalog = new ArrayList(); Random rn = new Random(); for ( int i = 0 ; i < size ; i++ ) { MusicMedia m; int mediatype = rn.nextInt( 3 ); String title = titles[ rn.nextInt( titles.length ) ]; String artist = artists[ rn.nextInt( artists.length ) ]; String sku = "1234-" + i; if ( mediatype == 0 ) m = new CompactDisk( title, artist, sku ); else if ( mediatype == 1 ) m = new DigitalVideoDisk( title, artist, sku ); else m = new CassetteTape( title, artist, sku ); catalog.add( m ); } return catalog; } public static String lookupMedia( ArrayList catalog, String sku ) { for ( MusicMedia m : catalog ) { if ( m.getSKU().equals( sku )) return "SKU is in catalog"; } return "SKU not in catalog"; } public static String detailedInventory( ArrayList catalog, ArrayList warehouse ) { String s = ""; for ( Bin bn : warehouse ){ s += "Bin " + bn.getName() + ":\n"; for (int i = 0; i < bn.getContents().size(); i++){ s += catalog.get(i) + ", " + bn.getContents().get(i) + "\n"; } } s += "\n"; return s; } public static void main( String[] args ) { ArrayList catalog = MakeMusicCatalog( 10 ); ArrayList warehouse = new ArrayList(); Bin a = new Bin( "A" ); Bin b = new Bin( "B" ); warehouse.add( a ); warehouse.add( b ); a.add( new BinItem( "1234-0", 500 ) ); a.add( new BinItem( "1234-1", 25 ) ); a.add( new BinItem( "1234-2", 7720 ) ); b.add( new BinItem( "1234-3", 1000 ) ); System.out.println( detailedInventory( catalog, warehouse ) ); } } 

我将bin中共享相同SKU的所有项目的集合称为“bin项目”。 Bin类的每个对象(未示出)表示假装仓库中的bin。 Bin对象有两个实例变量:一个包含bin名称的String和一个包含bin中存储的每个SKU的BinItem的ArrayList。 Bin类的toString方法使用BinItem类的toString方法。 它生成仅涉及SKU和数量的列表。

这种方法应该使用for-each循环来循环仓库中的所有仓。 对于每个bin,s应该由String“Bin”扩展,后跟bin的名称,后跟冒号和\ n以开始换行。 然后它应循环遍历当前bin中的所有bin项,对于每一个扩展s的新文本,以在输入目录中查找当前bin项的SKU的结果开始,并继续使用逗号后跟bin项的String表示forms。

输出应该如下所示:

斌A:
 CD  - 晚年(Shania Twain),SKU 1234-0:500
 Cassette  -  Greatest Hits Volume 2(The Beatles),SKU 1234-1:25
 Cassette  -  Greatest Hits Volume 1(Shania Twain),SKU 1234-2:7720

斌B: Cassette - Greatest Hits Volume 2(Michael Jackson),SKU 1234-3:1000

完整代码:

 public class MusicMedia { private String myTitle, myArtist, mySKU; public MusicMedia( String title, String artist, String sku ) { myTitle = title; myArtist = artist; mySKU = sku; } public String getTitle() { return myTitle; } public String getArtist() { return myArtist; } public String getMediaType() { return "Unknown"; } public String getSKU() { return mySKU; } public String toString() { return " - " + getTitle() + " (" + getArtist() + ")"; } } public class Disk extends MusicMedia { /** * Constructor for objects of class Disk */ public Disk( String title, String artist, String sku ) { super(title, artist, sku); } public String getMediaType() { return "Disk"; } public String toString() { return getMediaType() + super.toString(); } } 

我也有一个相同的CassetteTape类,它也扩展了MusicMedia。 还有另外两个Disk的子类,称为CompactDisk和DigitalVideoDisk。 这两个也几乎相同,所以我粘贴了下面的DVD类。

 public class DigitalVideoDisk extends Disk { /** * Constructor for objects of class DigitalVideoDisk */ public DigitalVideoDisk( String title, String artist, String sku ) { super(title, artist, sku); } public String getMediaType() { return "DVD"; } } public class BinItem { private String mySKU; private int myQuantity; public BinItem( String sku, int quantity ) { mySKU = sku; myQuantity = quantity; } public String getSKU() { return mySKU; } public int getQuantity() { return myQuantity; } public String toString() { return "SKU " + getSKU() + ": " + getQuantity(); } } public class Bin { private String myName; //bin name private ArrayList myContents; //contains a binItem public Bin( String name ) { myName = name; myContents = new ArrayList(); } public String getName() { return myName; } public ArrayList getContents() { return myContents; } public void add( BinItem b ) { myContents.add( b ); } public String toString() { String s = "Bin " + myName + ":\n"; for ( BinItem b : myContents ) s += b + "\n"; return s; } } 

好的,根据你的编辑:

…在输入目录中查找当前bin项目的SKU的结果…

你现在没有这样做,这是我们需要了解程序应该做什么的关键点。 现在你只是使用icatalog检索一个元素,基本上是任意的。

因此,您需要做的第一件事是创建一个帮助方法,在catalog中搜索某个SKU的MusicMedia对象。 你有一个非常类似于lookupMedia所以我只是将它修改为这个稍微不同的规范。 这将返回m而不是String值:

 public static MusicMedia getMediaBySKU( ArrayList catalog, String sku ) { for ( MusicMedia m : catalog ) { if ( m.getSKU().equals(sku) ) return m; } return null; } 

现在您可以根据SKU检索项目,您可以修改detailedInventory循环以使用它:

 for ( Bin bn : warehouse ){ s += "Bin " + bn.getName() + ":\n"; for ( BinItem item : bn.getContents() ){ MusicMedia mm = getMediaBySKU(catalog, item.getSKU()); s += mm + ", " + item + "\n"; } } 

(不知道如何从BinItem获取SKU,所以我猜到了,但我希望你能得到这个想法。如果你没有一个方法可以返回SKU,你可能需要制作一个。)