如何用for循环将ArrayList转HashMap并保证输出一致?代码转换结果不符排查
问题拆解与解决方案
咱们先来搞清楚为什么两种实现结果不一样,再看怎么用for循环把ArrayList转成HashMap,保证和原逻辑输出一致。
为什么你的HashMap实现和原for循环结果不同?
先看你注释掉的原逻辑:
for( Card cd :allKnownCards ) { if( cd.cardHasName( cardName ) ) { foundCard = cd ; } }
这段代码的核心是把整个列表遍历完,每次碰到名字匹配的Card就更新foundCard,最后返回的是列表里最后一个和cardName匹配的Card——哪怕列表里有好几个同名的Card,最后留下的是最后出现的那个。
再看你现在的HashMap写法:
if (allKnownCardsMap.containsKey(cardName)) { foundCard = allKnownCardsMap.get(cardName); }
问题肯定出在allKnownCardsMap的构建上:
- 要是你当初构建Map的时候,每个
cardName只存了第一个碰到的Card,那Map返回的就是第一个匹配的,和原逻辑返回最后一个的结果自然对不上; - 或者构建Map时没处理同名的情况,导致Map里存的不是最后一个出现的Card。
当然能用for循环把ArrayList转成HashMap,还能和原逻辑完全一致!
关键是要让HashMap里每个cardName对应的value,是ArrayList中最后一个名字匹配的Card。
正确的转换代码(用for循环)
你可以直接遍历allKnownCards列表,把每个Card往Map里存——后面的同名Card会自动覆盖之前存的,最后Map里每个key对应的就是最后出现的那个Card:
// 先初始化HashMap(如果还没创建的话) Map<String, Card> allKnownCardsMap = new HashMap<>(); // 用for循环遍历ArrayList,构建符合原逻辑的Map for (Card cd : allKnownCards) { // 这里要替换成你实际获取Card名字的方法,比如cd.getCardName() // 用Card的名字做key,当前Card做value存入Map allKnownCardsMap.put(cd.getCardName(), cd); }
修正后的findCard方法
等Map构建对了,你的findCard方法可以简化成这样,结果和原for循环完全一致:
public Card findCard(String cardName) { assert cardName != null; // Map的get方法会直接返回对应key的value,没有的话返回null,和原逻辑完全一致 return allKnownCardsMap.get(cardName); }
额外提一句
如果列表里根本没有匹配的Card,两种实现都会返回null,这部分是一致的。只有当列表里有多个同名Card的时候才会出现差异——原逻辑拿最后一个,错误构建的Map可能拿第一个或者其他值。
内容的提问来源于stack exchange,提问作者cacowa1
相关产品推荐
相关产品推荐

