Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中选择合适数据结构的问题_Java_Arraylist_Data Structures_Hashmap - Fatal编程技术网

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个映射,但这不能使用复

我的问题是有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中没有现成的数据结构可以满足您的需要。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块中