java最佳数据结构为两对多关系

时间:2013-11-12 14:19:50

标签: java sorting maps relationships

所以我有三个重要的因素,文件名有很多,也会有重复,违规类型有6个,以及与之相关的数据。

我正在考虑使用Map,但它只接受两种类型,所以我想按文件名对数据进行排序,对于该文件名下的每个条目,我想从我想要的内容中检索违规类型从数据中检索所有匹配,所以说它是我可以说map.get(文件名,违规)的地图,它将检索与之匹配的所有结果。

是否有可以让我这样做的数据结构?或者我是否懒惰,应该在输出数据时自己对数据进行排序。

3 个答案:

答案 0 :(得分:0)

您可以为mapkey使用自定义类,其中包含两个字段filename和违规类型。这样做时你需要实现equals()和hashCode()方法确保该类的实例可以用作map的键。

答案 1 :(得分:0)

您可以使用TreeMapTreeMap根据其键的自然顺序排序。

 TreeMap<String, List<String>> map = new TreeMap<String, List<String>>();

答案 2 :(得分:0)

另一种方法是使用自定义类来保存所需的数据。基本上“构建”您可以迭代的自己的节点。

例如!您可以创建以下类对象:(Node.java)

import java.util.*;

public class Node
{
    private String violationType;
    private String dataInside;

    public Node()
    {   
        this("", "");
    }
    public Node(String violationType)
    {
        this(violationType, "");
    }
    public Node(String violationType, String dataInside)
    {
        this.violationType = violationType;
        this.dataInside = dataInside;
    }
    public void setViolationType(String violationType)
    {
        this.violationType = violationType;
    }
    public void setDataInside(String dataInside)
    {
        this.dataInside = dataInside;
    }
    public String getViolationType()
    {
        return violationType;
    }
    public String getDataInside()
    {
        return dataInside;
    }
}
好的,很好,所以我们有一些'节点'的东西,包括一些setter,一些getter和一些易于使用的构造函数。凉。现在让我们看看如何使用它:

import java.util.*;

public class main{
    public static void main(String[] args){
        Map<String, Node> customMap = new HashMap<String, Node>();
        customMap.put("MyFilename", new Node("Violation 1", "Some Data"));
        System.out.println("This is a test of the custom Node: " + customMap.get("MyFilename").getViolationType());
    }
}

现在我们有一张地图可以将您需要的所有数据联系起来。现在,当涉及到这样的事情时,你会得到很多人说'不要重新发明轮子',因为内置库更加优化。这是真的!如果你能找到一个构建的数据结构进入适合您需求的java,使用它。这总是一个很好的政策。据说,如果你有一个非常自定义的情况,有时它需要一个自定义的方法。不要害怕自己做这样的对象,用Java很容易,它可以节省你很多时间和头痛!

修改

因此,在重新阅读OP的问题之后,我意识到你需要一个给定文件名给定违规的相关数据的完整列表。在这种情况下,您可以将private String dataInside切换为类似private ArrayList<String> dataInside;的内容,这样您就可以将所需数据关联到仍然位于该节点内部的arraylist内部。还要注意,你必须稍微调整一下getter / setter来容纳一个列表,但这并不算太糟糕。