2010-03-17 53 views
0

我有一个任务,我可以使用最简单的方法 - 数组。现在我想进一步使用一些更复杂的Java特性(比如集合)来重做它,但是我从来没有使用过比2d矩阵更复杂的任何东西。我应该看什么以及如何开始。塔应成为一个集合?这里的任务:使用集合重写数组

我们有两个班级 - 塔和块。塔从块建造。 安德这里的示例代码进行测试:

Block k1=new Block("yellow",1,5,4); 
Block k2=new Block("blue",2,2,6); 
Block k3=new Block("green",3,4,2); 
Block k4=new Block("yellow",1,5,4); 

Tower tower=new Tower(); 
tower.add(k1,k2,k3); 

"Added 3 blocks." 

System.out.println(tower); 

"block: green, base: 4cm x 3cm, thicknes: 2 cm 
block: blue, base: 6cm x 2cm, thicknes: 2 cm 
block: yellow, base: 5cm x 4cm, thicknes: 1 cm" 

tower.add(k2); 

"Tower already contains this block." 

tower.add(k4); 

"Added 1 block." 

System.out.println(tower); 

"block: green, base: 4cm x 3cm, thicknes: 2 cm 
block: blue, base: 6cm x 2cm, thicknes: 2 cm 
block: yellow, base: 5cm x 4cm, thicknes: 1 cm  
block: yellow, base: 5cm x 4cm, thicknes: 1 cm" 

tower.delete(k1); 

"Deleted 1 block" 

tower.delete(k1); 

"Block not in tower" 

    System.out.println(tower); 

"block: blue, base: 6cm x 2cm, thicknes: 2 cm 
block: yellow, base: 5cm x 4cm, thicknes: 1 cm  
block: yellow, base: 5cm x 4cm, thicknes: 1 cm" 

比方说,我会把塔为块的集合。如何在整个集合中执行特定块的搜索?或者我应该使用其他接口?

+0

难道这是预期的输出? – OscarRyz 2010-03-17 19:06:10

+0

是的。在“”这是这个示例测试代码的输出。 – owca 2010-03-17 19:49:51

回答

2

您可以使用防止重复元素的集合Set。如果您尝试添加已存在的元素,它将返回false

Set<Block> set = new HashSet<Block>(); 

boolean added = set.add(k1); 
if(added) { 
    System.out.println("Added 1 block."); 
} else { 
    System.out.println("Tower already contains this block."); 
} 

要知道该集合是否已经包含元素,该类应该正确实现equals()方法。

为了提供描述信息,你可以覆盖toString()方法和迭代集:

for(Block b : set) { 
    System.out.println(b); // invokes b.toString() 
} 
1

如果你的Tower类有一个成员变量是一个集合(Set似乎适合你的要求,不允许重复),那么你可以提供与你的数组实现相同的访问器。

然后你会保留你的域和模型的塔和砖。你也可以隐藏客户端的内部数据结构的实现,你不需要完全实现一个集合接口,其中可能包括你实际上不需要的方法。

1

你可以使用一个Set

使用Set,您不需要搜索重复项(我假设这就是为什么需要搜索功能),因为使用add(E)方法会返回一个标志,指示是否存在重复项。