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的结果…
你现在没有这样做,这是我们需要了解程序应该做什么的关键点。 现在你只是使用i
从catalog
检索一个元素,基本上是任意的。
因此,您需要做的第一件事是创建一个帮助方法,在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,你可能需要制作一个。)