在java中放置并获取嵌套的hashmap

时间:2017-09-15 08:20:58

标签: java data-structures hashmap

我是Java的新手,我正在尝试使用Hashmap实现一些东西。

以下代码是我首先声明的:

private HashMap<String, TreeMap<Object, Object>> submissions = new HashMap<String, TreeMap<Object, Object>>();;

public Submission add(String unikey, Date timestamp, Integer grade) {

        // check the argument
        if(unikey == null || timestamp == null || grade == null) {
            throw new IllegalArgumentException("Null argument detected\n");
        }
}

这就是我现在所写的内容。假设有一些名为&#34; person&#34;,&#34; data&#34;和&#34;等级&#34;。有人可以告诉我如何将它们放在嵌套的hashmap中吗?我为另一个名为MySubmissions的类中的每个项目编写了getter和setter。

Submission是一个用另一个类编写的接口,它包含以下方法:

public String getPerson();
public Date getTime();
public Integer getGrade();

我想要实现的是,例如,

?.add("aaaa1234", df.parse("2016/09/03 09:00:00"), 10);
?.add("aaaa1234", df.parse("2016/09/03 16:00:00"), 20);
?.add("cccc1234", df.parse("2016/09/03 16:00:00"), 30);
?.add("aaaa1234", df.parse("2016/09/03 18:00:00"), 40);

谢谢!

(我真正希望实现的是,我想将数据添加到hashmap中。然后使用另一个名为getBestGrade的方法,我希望在列表中找到最好的评分人员,但我只是想知道如何存储首先使用put和get ...)

进入hashmap

3 个答案:

答案 0 :(得分:0)

创建实体

public class Submission {

    private Date timestamp;

    private Integer grade;


    public Date getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(Date timestamp) {
        this.timestamp = timestamp;
    }

    public Integer getGrade() {
        return grade;
    }

    public void setGrade(Integer grade) {
        this.grade = grade;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Submission that = (Submission) o;

        if (timestamp != null ? !timestamp.equals(that.timestamp) : that.timestamp != null) return false;
        return grade != null ? grade.equals(that.grade) : that.grade == null;
    }

    @Override
    public int hashCode() {
        int result = timestamp != null ? timestamp.hashCode() : 0;
        result = 31 * result + (grade != null ? grade.hashCode() : 0);
        return result;
    }
}

创建HashMap

private HashMap<String, Submission> map = new HasMap<>();

添加

map.add("key", new Submission());

答案 1 :(得分:0)

我想他想知道如何为每个人存储多个提交内容。你可以这样做:

import java.util.Date;
import java.util.HashMap;
import java.util.TreeMap;

public final class BestGrade
{
    private static final HashMap<String, TreeMap<Date, Integer>> SUBMISSIONS = new HashMap<String, TreeMap<Date, Integer>>();

    private BestGrade()
    {}

    public static void main(final String[] args)
    {
        // How to add
        add("Person1", new Date(), Integer.valueOf(1));
        add("Person1", new Date(), Integer.valueOf(10));
        add("Person1", new Date(), Integer.valueOf(20));
        add("Person2", new Date(), Integer.valueOf(1));
        add("Person3", new Date(), Integer.valueOf(30));
        add("Person3", new Date(), Integer.valueOf(40));

        // How to get best grade
        final Integer bestGradePerson1 = getBestGrade("Person1");
        final Integer bestGradePerson3 = getBestGrade("Person2");
        final Integer bestGradePerson2 = getBestGrade("Person3");

        System.out.println("Bestgrade Person1: " + bestGradePerson1);
        System.out.println("Bestgrade Person2: " + bestGradePerson2);
        System.out.println("Bestgrade Person3: " + bestGradePerson3);
    }

    public static void add(final String key, final Date timestamp, final Integer grade)
    {
        // TODO the same for timestamp and grade
        if (key == null || key.trim().isEmpty()) {
            throw new IllegalArgumentException("key must not be null");
        }

        // Get
        TreeMap<Date, Integer> submission = SUBMISSIONS.get(key);
        // Create your treemap if not already exists, before adding new value to avoid NullPointerException
        if (submission == null) {
            submission = new TreeMap<Date, Integer>();
            SUBMISSIONS.put(key, submission);
        }
        submission.put(timestamp, grade);
    }

    public static Integer getBestGrade(final String key)
    {
        Integer bestGrade = null;

        final TreeMap<Date, Integer> submission = SUBMISSIONS.get(key);
        if (submission == null) {
            // When no submission available, return null or any other value you wish to show there is no best grade
            return bestGrade;
        }

        for (final Integer grade : submission.values()) {
            if (bestGrade == null) {
                bestGrade = grade;
            }
            // Set new grade when values is higher than before
            else if (bestGrade.intValue() < grade.intValue()) {
                bestGrade = grade;
            }
        }
        return bestGrade;
    }
}

答案 2 :(得分:0)

我将描述如何使用地图地图 - 由您来决定这是否是您真正想要使用的地图。我将使用名为ABC等的类 - 您可以替换自己的类,包括StringSubmission你喜欢。

在解决此问题之前,请确保您对单级Map有充分的了解 - equals()hashCode()HashMapMap<A, ? extends Map<B,C>> mapOfMaps; 是必需的。

您可以像以前一样定义地图地图:

Map

通常,为变量提供HashMap而不是TreeMap? extends Map<>的类型 - 您通常不需要任何更具体的实现类方法。如果你这样做,你总是可以改变。 Map部分允许您的地图地图包含Map<A, ? extends Map<B,C>> mapOfMaps = new HashMap<>(); // or with explicit (unnecessary) type declarations: Map<A, ? extends Map<B,C>> mapOfMaps = new HashMap<A, ? extends Map<B,C>>(); 的任意实现。

您可以像这样实例化:

Map<B,C> map = new HashMap<>();
mapOfMaps.put(new A(1), map);

现在你有一张空地图。您可以向其添加地图:

Map<B,C> map = new HashMap<>();
map.put(b, c);
mapOfMaps.put(a, map);

现在你有一张包含一张空地图的地图图。或者您可以添加包含某些内容的地图:

Map<B,C>

当你不知道它是否存在时,你想要将项目添加到void addToMapOfMaps(A a, B b, C c) { Map<B,C> map = mapOfMaps.get(a); if(map == null) { map = new HashMap<>(); mapOfMaps.put(a,map); } map.put(b,c); } 。这里没有捷径 - 你必须这样做:

C get(A a, B b) {
    Map<B,C> map = mapOfMaps.get(a);
    if(map == null) {
         return null;
    }
    return map.get(b);
}

请注意,如果多个线程同时执行此操作,则会出现此问题。

同样,如果你只是阅读,你必须在两个层面处理缺失的元素:

C get(A a, B b) {
    Map<B,C> map = mapOfMaps.get(a);
    return map == null ? null : map.get(b);
}

(或更紧凑)

$('td:contains("label label-primary")').parent().hide();