Java中选择合适数据结构的问题
我的问题是有3个变量,比如a,b,c 首先,需要输入和存储信息a、b、c 例如a=Tom,b=school a,c=1402 然后,我可以通过输入“Tom”来获得上述信息,在这种情况下,如果B学校还有另一个Tom,该消息也会被打印出来 或者输入“汤姆,A学校”,那么只有汤姆会被打印出来。在这个问题中,如果a和b都被锁定,它们就不会重复 我的观点是a必须是一个键,a+b可以是一个复合键。所以首先我想到了HashMap,然而,HashMap只有一个键对应一个值。所以我打算使用2个映射,但这不能使用复合键 那么我的想法正确吗?或者在这种情况下是否可以使用Java中更好的数据收集Java中选择合适数据结构的问题,java,arraylist,data-structures,hashmap,Java,Arraylist,Data Structures,Hashmap,我的问题是有3个变量,比如a,b,c 首先,需要输入和存储信息a、b、c 例如a=Tom,b=school a,c=1402 然后,我可以通过输入“Tom”来获得上述信息,在这种情况下,如果B学校还有另一个Tom,该消息也会被打印出来 或者输入“汤姆,A学校”,那么只有汤姆会被打印出来。在这个问题中,如果a和b都被锁定,它们就不会重复 我的观点是a必须是一个键,a+b可以是一个复合键。所以首先我想到了HashMap,然而,HashMap只有一个键对应一个值。所以我打算使用2个映射,但这不能使用复
谢谢你的时间 Java中没有现成的数据结构可以满足您的需要。Apache Commons和Google Guava集合中有多值映射实现,但核心Java中没有 但是,在我看来,您可以使用map声明来实现它,比如-
map
或map
,这取决于您是将学生详细信息作为串联字符串还是作为student
类来保存
填充地图时-您将在地图中为第一行/学生创建两个条目,一个用于a
,另一个用于a+b
然后,在为后续行创建条目时,应首先检查键是否存在于映射中,如果存在,则获取值,追加新值并再次存储
记录a=Tom,b=school a,c=1402
将有两个条目,然后记录a=Tom,b=school b,c=1403
,您将为key=Tom
添加一个新条目,并为tomschool b
添加一个新条目,因此在map中总共有三个条目用于key-Tom
、tomschool a
和tomschool
。键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);
}
}
}
这只是给出一个粗略的概念,即可以通过列表处理多个值
编辑:从您的评论中,您看起来很困惑,下面是实现该想法的代码。您可以根据需要调整和扩展它
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);
}
}
}
Java中没有现成的数据结构可以满足您的需要。Apache Commons和Google Guava集合中有多值映射实现,但核心Java中没有 但是,在我看来,您可以使用map声明来实现它,比如-
map
或map
,这取决于您是将学生详细信息作为串联字符串还是作为student
类来保存
填充地图时-您将在地图中为第一行/学生创建两个条目,一个用于a
,另一个用于a+b
然后,在为后续行创建条目时,应首先检查键是否存在于映射中,如果存在,则获取值,追加新值并再次存储
记录a=Tom,b=school a,c=1402
将有两个条目,然后记录a=Tom,b=school b,c=1403
,您将为key=Tom
添加一个新条目,并为tomschool b
添加一个新条目,因此在map中总共有三个条目用于key-Tom
、tomschool a
和tomschool
。键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);
}
}
}
这只是给出一个粗略的概念,即可以通过列表处理多个值
编辑:从您的评论中,您看起来很困惑,下面是实现该想法的代码。您可以根据需要调整和扩展它
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);
}
}
}
当您对使用任何现有数据结构感到不明确时,我建议您创建自己的数据结构。使用它,您可以根据需要创建任何方法和任何内容。当您对使用任何现有数据结构感到不明确时,我建议您创建自己的数据结构。使用它,您可以创建任何方法和任何内容根据您的需要。hashmap中的键可以是对象,因此它可以是同时包含a和b的对象。您可以使用hashmap。只要确保CompositeKey正确覆盖equals()和hashCode()。您可以使用像
HashMap
@SanketMakani这样的数据结构,这样就可以工作,但很容易丢失并出错。什么是HashMap?这是否意味着我应该创建key1和key2?hashmap中的键可以是一个对象,因此它可以是一个同时包含a和b的对象。您可以使用hashmap。只要确保CompositeKey正确覆盖equals()和hashCode()。您可以使用像HashMap
@SanketMakani这样的数据结构,这样就可以工作,但很容易丢失并出错。什么是HashMap?这是否意味着我应该创建key1和key2?嗯,我创建了一个连接了两个贴图的键,但效果不好。也许我需要处理这个问题。我创建了一个连接了两个地图的地图,但效果不好。也许我需要做更多的工作,然后我将不得不创建许多列表,但我找不到一种方法来做到这一点。例如,我现在首先检查键“Tom”是否存在。如果它不存在,我将创建一个新列表。但是如果输入了其他学生的名字,就应该创建新的列表。那么如何创建这些列表呢?我不明白你的问题。它将是一个if-else
块。如果键存在,则为键添加现有列表,否则创建一个新列表并将该键存储在地图中的else块中