打印的方法就是调用的tostring方法。
我知道了,下一节有思路
重写equals方法比较id是否相同
然后判断商品map里是否包含那个id
包含就取出原来的值赋值给一个初始值,否则初始值为0
然后初始值自增
goods对象没有实例化呗
数量不应该作为商品类实例的固有属性,要不然变更数量会很麻烦
while (it.hasNext()) { Entry<Items, Integer> i = it.next(); System.out.println(i); }
打印输出的是 i, 而 i 是一个键值对。
等号左边是键,就是你重写的toString方法的输出;
等号右边是值,就是商品数量。
当然可以啊
获得商品全部信息,entry是map的一个内部类,相当于既获得了key,又获得了value,其实和keyset类似。
可能是cookie里的键不能为数字,你换英文字符串试一下
你是个什么意思? 你是说goods.get(i)取到的值永远是1?
这是循环啊,it.next()每一次取出的值都是不同的啊,是根据商品的属性去取出了商品的数量啊,所以也许数量会是1,但是商品是不同的,
hashmap遍历输出是键值对Map.Entry<Item, Integer>,就像每次输出一行键值对,toString()只影响Item项的格式,而Integer的输出内定的=Integer.不知道解释的清楚不:)
改成for (Map.Entry<Goods, Integer> obj : goods)
entyrset()方法本身获取的就是一个HashMap键值对的键的集合。所以这里已经获得了作为键的Items类型的集合。所以这里的obj本身就是key值。
public Items(int id,String name,String city,int price,int number,String picture)
{
this.id = id;
this.name = name;
this.city = city;
this.picture = picture;
this.price = price;
this.number = number;
}
这个是一样的,最后的结果就是遍历整个集合,你说的前面一节用迭代器,因为set集合实现了Serializable接口,所以可以用迭代器来遍历整个集合,当然你也可以用增强for循环,这都是可以的。
对于你说的,现在遍历商品集合时候用增强·for循环,其实你可以用迭代器,只不过的得到i.next()的类型是Map.Entry<items,number>,其他都是一样的,你可以试一下,祝你好运。
补个图,应该能比较容易的看出来了,第一个添加的数量2被覆盖了,同时也能够看出来对象作为键值的时候即便里面的数据完全一样,只要不是同一个对象就不是同一个键。
直接return totalprice并不会导致结果发生改变,所以应该是其他问题,或者请把代码贴全
while(it.hasNext())
{
Items i=it.next();
this.setTotalPrice(this.getTotalPrice()+i.getPrice()*goods.get(i));
}
return this.getTotalPrice();
结果:1200
在add的方法里你没有写
if(goods.containsKey(item)){ goods.put(item, goods.get(item)+num); }else{ goods.put(item, num); }
因为Map里的key是不可以重复的,你2次添加的i1和i3相当于重复添加了一个key,后者把前者的value值覆盖了
因为你重写的代码里面没有哈西码的部分
我也不懂
主要原因是重写了items类的hasCode和equals()方法,
Set<Entry<Items,Integer>> items = cart.getGoods().entrySet();
for(Entry<Items,Integer> obj:items)
{
System.out.println(obj);
}
MDZZ这是泛型 不是键值
一样啊 map就是通过entry实现的,entry对象封装了key 和value
public Items(int id,String name,String city,int price,int number,String picture) { this.id = id; this.name = name; this.city = city; this.picture = picture; this.price = price; this.number = number; }
粘到Items类中
请把完整代码贴出来,谢谢!这样子叫我们凭空想象吗?
Map是java中的接口,Map.Entry是Map的一个内部接口。
Map提供了一些常用方法,如keySet()、entrySet()等方法。
keySet()方法返回值是Map中key值的集合;entrySet()的返回值也是返回一个Set集合,此集合的类型为Map.Entry。
Map.Entry是Map声明的一个内部接口,此接口为泛型,定义为Entry<K,V>。它表示Map中的一个实体(一个key-value对)。接口中有getKey(),getValue方法。
如果是输出对象的话默认就调用toString方法