Java 如何使用相同的键计算hashmap值的平均值
所以我有一个程序,它计算所有具有相同键但不同值的Petshop的总和。但是,现在,我想计算具有相同密钥的每个petshop的平均值。我正在考虑使用计数器来获取arraylist中包含宠物店的次数。但它不起作用。我需要为每个循环运行另一个循环吗Java 如何使用相同的键计算hashmap值的平均值,java,hashmap,Java,Hashmap,所以我有一个程序,它计算所有具有相同键但不同值的Petshop的总和。但是,现在,我想计算具有相同密钥的每个petshop的平均值。我正在考虑使用计数器来获取arraylist中包含宠物店的次数。但它不起作用。我需要为每个循环运行另一个循环吗 public class AverageCost { public void calc(ArrayList<Pet> pets) { Map<String, Double> hm = new HashM
public class AverageCost {
public void calc(ArrayList<Pet> pets) {
Map<String, Double> hm = new HashMap<>();
for (Pet i : pets) {
String name = i.getShop();
// If the map already has the pet use the current value, otherwise 0.
double price = hm.containsKey(name) ? hm.get(name) : 0;
price += i.getPrice();
hm.put(name, price);
}
System.out.println("");
for (String key : hm.keySet()) {
System.out.printf("%s: %s%n", key, hm.get(key));
}
}
公共类平均成本{
公共无效计算(数组列表宠物){
Map hm=新的HashMap();
用于(宠物i:宠物){
字符串名称=i.getShop();
//如果地图上已经有宠物,请使用当前值,否则为0。
双倍价格=hm.containsKey(名称)?hm.get(名称):0;
price+=i.getPrice();
hm.put(名称、价格);
}
System.out.println(“”);
for(字符串键:hm.keySet()){
System.out.printf(“%s:%s%n”,key,hm.get(key));
}
}
您可以引入第二张地图进行计数,或者在地图中使用复合值对象来保存宠物的累计价格和数量:
Map<String, PetStatistics> hm = new HashMap<>();
for (Pet i : pets) {
String name = i.getShop();
// If the map already has the pet use the current value, otherwise 0.
PetStatistics stats = hm.get(name);
if (stats == null) {
stats = new PetStatistics(0, 0); // count and price
hm.put(name, stats);
}
stats.addPrice(i.getPrice());
stats.incrementCount();
}
Map hm=newhashmap();
用于(宠物i:宠物){
字符串名称=i.getShop();
//如果地图上已经有宠物,请使用当前值,否则为0。
PetStatistics=hm.get(name);
如果(stats==null){
stats=new-PetStatistics(0,0);//计数和价格
hm.put(姓名、统计数据);
}
stats.addPrice(i.getPrice());
stats.incrementCount();
}
您可以引入第二张地图进行计数,或者在地图中使用复合值对象来保存宠物的累计价格和数量:
Map<String, PetStatistics> hm = new HashMap<>();
for (Pet i : pets) {
String name = i.getShop();
// If the map already has the pet use the current value, otherwise 0.
PetStatistics stats = hm.get(name);
if (stats == null) {
stats = new PetStatistics(0, 0); // count and price
hm.put(name, stats);
}
stats.addPrice(i.getPrice());
stats.incrementCount();
}
Map hm=newhashmap();
用于(宠物i:宠物){
字符串名称=i.getShop();
//如果地图上已经有宠物,请使用当前值,否则为0。
PetStatistics=hm.get(name);
如果(stats==null){
stats=new-PetStatistics(0,0);//计数和价格
hm.put(姓名、统计数据);
}
stats.addPrice(i.getPrice());
stats.incrementCount();
}
您需要的是一种算法,用于计算累计移动平均值,而不存储迄今为止累计的术语数量。我认为这是不可能的(例如,请参见其中“n”,即迄今为止需要的术语数量).我的建议是使用两次传递-第一次用于存储数字,第二次用于计算平均值
public void calc(List<Pet> pets) {
// First pass
Map<String, List<Double>> firstPass = new HashMap<>();
for (Pet pet : pets) {
String name = pet.getShop();
if (firstPass.containsKey(name)) {
firstPass.get(name).add(pet.getPrice());
} else {
List<Double> prices = new ArrayList<>();
prices.add(pet.getPrice());
firstPass.put(name, prices);
}
}
// Second pass
Map<String, Double> results = new HashMap<>();
for (Map.Entry<String, List<Double>> entry : firstPass.entrySet()) {
Double average = calcAverage(entry.getValue());
results.put(entry.getKey(), average);
// Print results
System.out.printf("%s: %s%n", entry.getKey(), average);
}
}
private double calcAverage(List<Double> values) {
double result = 0;
for (Double value : values) {
result += value;
}
return result / values.size();
}
公共作废计算(列出宠物){
//第一关
Map firstPass=newhashmap();
用于(宠物:宠物){
字符串名称=pet.getShop();
if(首次通行证。集装箱(名称)){
firstPass.get(name.add(pet.getPrice());
}否则{
标价=新的ArrayList();
添加(pet.getPrice());
首次通行证(名称、价格);
}
}
//第二关
映射结果=新的HashMap();
for(Map.Entry:firstPass.entrySet()){
双重平均=平均值(entry.getValue());
results.put(entry.getKey(),average);
//打印结果
System.out.printf(“%s:%s%n”,entry.getKey(),average);
}
}
私有双平均值(列表值){
双结果=0;
for(双值:值){
结果+=数值;
}
返回结果/值。size();
}
您需要的是一种算法,用于计算累计移动平均值,而不存储迄今为止累计的术语数量。我认为这是不可能的(例如,请参见其中“n”,即迄今为止需要的术语数量).我的建议是使用两次传递-第一次用于存储数字,第二次用于计算平均值
public void calc(List<Pet> pets) {
// First pass
Map<String, List<Double>> firstPass = new HashMap<>();
for (Pet pet : pets) {
String name = pet.getShop();
if (firstPass.containsKey(name)) {
firstPass.get(name).add(pet.getPrice());
} else {
List<Double> prices = new ArrayList<>();
prices.add(pet.getPrice());
firstPass.put(name, prices);
}
}
// Second pass
Map<String, Double> results = new HashMap<>();
for (Map.Entry<String, List<Double>> entry : firstPass.entrySet()) {
Double average = calcAverage(entry.getValue());
results.put(entry.getKey(), average);
// Print results
System.out.printf("%s: %s%n", entry.getKey(), average);
}
}
private double calcAverage(List<Double> values) {
double result = 0;
for (Double value : values) {
result += value;
}
return result / values.size();
}
公共作废计算(列出宠物){
//第一关
Map firstPass=newhashmap();
用于(宠物:宠物){
字符串名称=pet.getShop();
if(首次通行证。集装箱(名称)){
firstPass.get(name.add(pet.getPrice());
}否则{
标价=新的ArrayList();
添加(pet.getPrice());
首次通行证(名称、价格);
}
}
//第二关
映射结果=新的HashMap();
for(Map.Entry:firstPass.entrySet()){
双重平均=平均值(entry.getValue());
results.put(entry.getKey(),average);
//打印结果
System.out.printf(“%s:%s%n”,entry.getKey(),average);
}
}
私有双平均值(列表值){
双结果=0;
for(双值:值){
结果+=数值;
}
返回结果/值。size();
}
您可以使用Collections.frequency获取发生次数并除以整个总和
for (String key : hm.keySet()) {
int w = Collections.frequency(pets, new Pet(key));
System.out.printf("%s: %s%n", key, hm.get(key)/w);
}
您可以使用Collections.frequency来获取发生次数并除以总和
for (String key : hm.keySet()) {
int w = Collections.frequency(pets, new Pet(key));
System.out.printf("%s: %s%n", key, hm.get(key)/w);
}
你的问题让我有点困惑。在
哈希映射中不能有重复的键。因此,当你说时,我想计算具有相同键的每个petshop的平均值,每个键只有一个条目。你可以引入第二个映射进行计数,或者在映射中使用复合值对象来保存两个累积价格宠物数量:Map hm
也许你想在hashmap上存储平均值,不是吗?例如:Law Pet shop:7.00和另一家Law Pet shop:5.00,输出:Law Pet shop:13.00。这是当前的输出,是一个加法。但现在我想计算平均值。hashmap不是这样工作的。你永远不会有一个ent用“法律宠物店”的钥匙在地图上搜索和另一个具有相同密钥的条目。当您尝试存储具有相同密钥的第二个或后续条目时,会覆盖上一个条目。我对您的问题有点困惑。在哈希映射中不能有重复的密钥。因此,当您说时,我想计算具有相同密钥的每个petshop的平均值每把钥匙只能输入一个条目。您可以引入第二个地图进行计数,或者在地图中使用复合值对象来保存宠物的累计价格和数量