首页 新闻 会员 周边

List的contains方法间歇性的失效,求指点,可怜可怜我这个在除夕夜学Java的小白吧,23333

0
[已解决问题] 解决于 2017-02-01 12:57

public void Card(){
String storage1 = "黑桃红桃梅花方片";
String storage2 = "123456789JQKA";

List <StringBuilder> washCard = new ArrayList<StringBuilder>();
List <String> colour = new ArrayList<String>();
String Card = new String ();
for(;colour.size()<4;)
{
do
{
//控制花色种类
int S1=(int)(Math.random()*4);
Card = storage1.substring(S1*2, S1*2+2);

//控制花色的大小
for(int number =0; number<13;number++)
{
Bd = new StringBuilder();
//不考虑大小王,每种花色的扑克牌一共十三种大小,所以循环13次

//每次都加入一种进入washCard

//防止重复添加,所以用List的contains查看有没有该扑克牌,有就用dowhile重新循环一次,没有再添加
do
{
Bd.append(Card);
int S2 =(int)(Math.random() * 13) ;
if(S2==0)
{
Bd.append("10");

}
else
{
Bd.append(storage2.charAt(S2));

}
}while(washCard.contains(Bd));

//这里输出总是显示FALSE,即使重复也是FALSE,我用eclipse自动重写equals方法和HashCode也还是不行
System.out.println(washCard.contains(Bd));  


washCard.add(Bd);
System.out.println(Bd);

//这里输出总是显示TRUE,这个好理解,因为刚刚添加了
System.out.println(washCard.contains(Bd));
}
}while(colour.contains(Card));
colour.add(Card);


// (washCard.contains(Cd));
// washCard.add(Cd);


}
for(int num = 0; num<washCard.size();num++ )
{
System.out.print( "<"+washCard.get(num)+">");
System.out.println(washCard.size());
}

 

 

下面是输出效果

false
方片6
true
false
方片5
true
false
方片2
true
false
方片K                                              //这里显示添加了方片K
true
false                                               //这里显示FALSE
方片K                                              //刚刚查询的花色是方片K ,上面明明添加了 
true
false
方片J
true
false
方片3
true
false
方片2
true
false
方片A
true
false
方片4
true
false
方片5
true
false
方片2
true
false
方片10
true
false
梅花3
true

TimeIsChoice的主页 TimeIsChoice | 初学一级 | 园豆:5
提问于:2017-01-28 10:35
< >
分享
最佳答案
2

这个代码写得,格式太乱了 就是contain方法那里有问题,你难道重写StringBuilder类的equals 和hashcode方法???你重写的判断肯定是有问题的。

你知道用StringBuilder,其实在你这里直接用String也差不多,因为没有大量的拼接字符串,差不多,

 

奖励园豆:5
假程序猿 | 菜鸟二级 |园豆:226 | 2017-01-29 13:40

 感谢您的指点,我代码写的确实太乱了,听你这么说我的确略微有点小打击,我以后会注意的,但是,我实验了几次,然后查了StringBuilder源码,发现里面貌似没有equals方法。目前还不清楚判断哪儿出了错,,,至于用和String相比,还是差一点的,一开始用String是完全没有问题的,但是cpu占用率100%,,,所以改成了StringBuilder,,,但是改成StringBuilder就无法判断,,,诶,好气啊

TimeIsChoice | 园豆:5 (初学一级) | 2017-01-29 15:01

@时间就是选择: 不好意思,没看到你回复,这个貌似回复了没有任何提示我。。。。只是想提醒一下注意格式,没想到会给你造成打击,不要太放心上。按理说不可能占用100cpu的。

终有知道为什么会占用那么多内存了,是因为你在随机13张牌的时候i,一直在排除重复的,而越到后面出现重复的可能性就越大,所以一直在产生对象一直出现重复的。

 

其实你可以换种思路,你想随机取出13张牌,没必每次去取一个来判断重复的。你只需要把13张牌顺序随机排列一下(可以放到一个数组中,每张是数组一个元素),然后再依次取出,效果也是一样的

假程序猿 | 园豆:226 (菜鸟二级) | 2017-01-31 23:32

@时间就是选择: 帮你细看了下,写的好复杂,你只是想按花色随机生成一副牌吧

。。。。Bd = new StringBuilder();。。。

}while(washCard.contains(Bd));就是这个方法的问题你没有完全弄懂这个方法的意思!!!

它会比较Bd对象是否存在即比较的是StringBuilder对象的hashcode 和equals 方法。而StringBuilder是final不能继承所以你不能重写它的方法。那么它比较是就是对象。所以永远不会是同一个对象,永远是false

假程序猿 | 园豆:226 (菜鸟二级) | 2017-02-01 00:18

@一将攻城: 我才刚刚开始,你指明的话对我来讲越挫越勇,是好事的,你说的那个我之前也试过了,但是和要求不符,就注释掉了。 

TimeIsChoice | 园豆:5 (初学一级) | 2017-02-01 12:53

@一将攻城: 谢谢啊,凌晨了还在帮我看,你说的我理解了,应该是这样。感动满满,我只能祝愿你在新年里达到自己的目标吧,新年快乐!

TimeIsChoice | 园豆:5 (初学一级) | 2017-02-01 12:56

@时间就是选择: 同上,你也新年快乐,加油。

假程序猿 | 园豆:226 (菜鸟二级) | 2017-02-01 14:05
其他回答(1)
0

 建议看下华为的编程规范  

小白江红 | 园豆:106 (初学一级) | 2017-02-04 17:48
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册