我的问题是有3个变量,比如a,b,c
首先,需要输入和存储信息a,b,c。
例如a = Tom,b =学校A,c = 1402
然后,我可以输入“Tom”来获取上述信息,在这种情况下,如果学校B中还有另一个Tom,那么该信息也会被打印出来。
或者输入“Tom,A学校”,然后才会打印出Tom。在这个问题中,如果a和b都被锁定,它们将不会重复。
嗯,我的观点是必须是一个键,而一个+ b可以是一个复合键。首先我想到了一个HashMap,但是,HashMap只有一个键到一个值。所以我打算使用2张地图,但这不能使用复合键。
我的想法是否正确?或者在这种情况下是否可以使用Java中更好的数据集合?
感谢您的时间!
答案 0 :(得分:0)
Java中没有现成的数据结构供您根据需要使用。 Apache Commons和Google Guava Collections中有多值的地图实现,但核心Java中却没有。
但是,在我看来,您可以使用地图声明(例如Map<String, List<String>>
或Map<String, List<Student>>
)来实现它,具体取决于您是将学生详细信息保留为连接字符串还是Student
类。
在填充地图时 - 您将在地图中为第一行/学生创建两个条目,一个用于a
,另一个条目用于a+b
连接。
然后在为后续行创建条目时,首先应检查映射中是否存在键,如果存在,则获取值,追加新值并再次存储。
记录a=Tom, b=school A, c=1402
将有两个条目,然后记录a=Tom, b=school B, c=1403
,您将为密钥= Tom
追加记录并为TomschoolB
添加新条目,因此共有三个条目在地图中输入密钥 - Tom
,TomschoolA
和TomschoolB
。键Tom
将在值列表中包含两个项目,而其余两个将包含单个项目。
您的查找代码应遵循密钥计算逻辑作为密钥创建逻辑,即字符串连接或您希望的任何其他内容。
这只是粗略地了解可以通过列表处理多个值。
编辑:从您的评论中,您看起来很困惑,所以下面是实现这个想法的代码。您可以根据需要调整和扩展它。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MultiValuedMap {
private static Map<String,List<String>> storage = new HashMap<>();
public static void main(String[] args) {
store("Tom","Tom,schoolA,1402");
store("TomschoolA","Tom,schoolA,1402");
store("Tom","Tom,schoolB,1402");
store("TomschoolB","Tom,schoolB,1403");
storage.forEach((key,value) -> System.out.println("key:"+key+",value:"+value));
}
private static void store(String key, String value){
if(storage.containsKey(key)) {
List<String> newList = storage.get(key);
newList.add(value);
storage.put(key,newList);
}else{
List<String> values = new ArrayList<String>();
values.add(value);
storage.put(key,values);
}
}
}
<强>输出:强>
key:Tom,value:[Tom,schoolA,1402, Tom,schoolB,1402]
key:TomschoolB,value:[Tom,schoolB,1403]
key:TomschoolA,value:[Tom,schoolA,1402]
答案 1 :(得分:0)
如果您对使用任何现有数据结构感到不明确,我建议您创建自己的数据结构。您可以根据需要创建任何方法和任何内容。