所以我有三个重要的因素,文件名有很多,也会有重复,违规类型有6个,以及与之相关的数据。
我正在考虑为此使用 Map 但它只接受两种类型,所以我想按文件名对数据进行排序,对于该文件名下的每个条目,我想检索违规类型,从我希望它检索所有来自数据的匹配,所以说它是我可以说 map.get(filename,violation) 的地图,它会检索所有匹配的结果。
有没有可以让我这样做的数据结构?还是我很懒惰,在输出数据时应该自己对数据进行排序。
所以我有三个重要的因素,文件名有很多,也会有重复,违规类型有6个,以及与之相关的数据。
我正在考虑为此使用 Map 但它只接受两种类型,所以我想按文件名对数据进行排序,对于该文件名下的每个条目,我想检索违规类型,从我希望它检索所有来自数据的匹配,所以说它是我可以说 map.get(filename,violation) 的地图,它会检索所有匹配的结果。
有没有可以让我这样做的数据结构?还是我很懒惰,在输出数据时应该自己对数据进行排序。
您可以为包含两个字段文件名和违规类型的映射键使用自定义类。这样做时,您需要实现 equals() 和 hashCode() 方法,确保该类的实例可以用作 map 的键。
您可以使用TreeMap
. TreeMap
根据其键的自然顺序排序。
TreeMap<String, List<String>> map = new TreeMap<String, List<String>>();
解决此问题的另一种方法是使用自定义类来保存所需的数据。本质上是“构建”您自己的节点,您可以对其进行迭代。
例如!您可以创建以下类对象:(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;
,这样您就可以关联尽可能多的数据,仍然在该节点内,就在数组列表内。另请注意,您必须稍微切换 getter/setter 以容纳列表,但这还不错。