我知道它被问过一百次,答案总是一样的,你不能在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.
我不想使用数组列表。
答案 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;
}