具有多个值的Java哈希映射

时间:2017-02-22 07:34:30

标签: java hashmap

我知道它被问过一百次,答案总是一样的,你不能在hashmap中使用多个重复值。 但是让我们解决问题。我有一个导入文件,导入文件包含CustomerID,ProductID和销售单位(基本收据格式)的信息。 我想要做的是进行导入,将其放入地图,并能够引用它。

GridLayout

导入文件的格式为

Map<integer,DoubleSales> hashmap = new HashMap <integer,DoubleSales>
 try {
Scanner dataFile = new Scanner 9new File ("./salesData.csv"));
dataFile.nextLine();
while(dataFile.hasNextLine()){
String[] lineValues = line.split (",");
Integer CustomerID = Integer.parseInt(lineValues[0]);
Integer ProductID = Integer.parseInt(lineValues[1]);
integer Units = Integer.parseInt(lineValues[2]);
DoubleSales sales = new DoubleSales(CustomerID,ProductID,Units);
ProductData.put(CustomerID,sales);
}

class DoubleSales{
int CustomerID;
int ProductID;
int Units;

DoubleSales(int custID, int prodID, int Units){
CustomerID = custID;
ProductID = prodID;
Units = units;
}
}

在那里使用代码,当我打印customerID值为1时,我只得到最后一个条目CustomerID, ProductID, UnitsSold 1,10002,3 1,10004,5 1,10008,2 1,10010,3 1,10010,3 如何打印出来,CustomerID 1的所有值和销售的单位?

10010,3.

我不想使用数组列表。

5 个答案:

答案 0 :(得分:2)

从Apache Common Collections尝试MultiValueMap。

Click here以获取更多参考资料

答案 1 :(得分:2)

如果你想保留所条目,同时保持他们容易被引用,尝试:

首先,创建一个结构化地图

Map

其次,添加这样的产品

Map<Integer,List<DoubleSales>> productData = new HashMap<Integer,List<DoubleSales>>();

第三,检查刚刚添加的产品列表

List<DoubleSales> entries;
if(productData.get(CustomerID) == null) {
    entries = new ArrayList<DoubleSales>();
    entries.add(sales);
    productData.put(CustomerID, entries);
} else {
    List<DoubleSales> entries = productData.get(CustomerID);
    entries.add(sales);
}

答案 2 :(得分:1)

您已复制CustomerID(所有1作为ID)并且您将其用作Hashmap中的键。这就是当你插入一个具有相同id的新记录时它保持ovverding的原因。看起来您的产品ID是唯一的。试试或拥有唯一的客户ID。

答案 3 :(得分:0)

我认为在这种情况下,最好用矩阵实现结构。它可以通过数组(或列表)轻松完成,其中行可以包含由产品ID和销售单位组成的bean,由客户ID索引

答案 4 :(得分:0)

我的第一个想法是Jerry Chin的解决方案,但我想向您展示第二种方法,只是为了证明同一问题有多种解决方案。

您可以将值存储在TreeSet<DoubleSales>中。这不会限制条目,您可以根据需要多次输入1,10010,3

然后,在Comparator上定义排序(DoubleSales),按客户ID对订单进行分组。

打印列表时,可以检查当前记录的customerID是否与prevoius记录不同。如果不同,那么它是新客户的第一个记录。如果没有,它属于同一个客户。

代码:

SortedSet<DoubleSales> set = new TreeSet<DoubleSales>(new Comparator<DoubleSales>() {
    @Override
    public int compare(DoubleSales o1, DoubleSales o2) {
        return Long.compare(o1.customerId, o2.customerId);
    }
});

// ... import data
set.add(new DoubleSales( /*...*/ ));

// iterate through data
DoubleSales prevDS = null;
for (DoubleSales ds : set) {
    if (prevDS == null || ds.customerId != prevDS.customerId) {
        // first record of a customer
        // print CustomerID, ProductID, UnitsSold
    } else {
        // second or next record of a customer
        // print ProductID, UnitsSold only
    }
    prevDS = ds;
}