如何将Arraylist<object>作为参数放入HashMap in Java?
How to put Arraylist<object> as parameter in HashMap in Java?
我正在做一个 Java 项目 - 预算经理,它显示了我如何花钱。
为此,我使用 Hashmap
来存储带有字符串(枚举)参数的购买类型,以及 Arraylist<Product>
。产品是新产品 class,其中要传递名称和价格。
如何将 ArrayList
中的多个值放入 HashMap
中的同一个键?
switch (choice) {
case 1:
mapProducts.put(Product.Type.FOOD.name(),//add array);
break;
case 2:
mapProducts.put(Product.Type.CLOTHES.name(), );
break;
case 3:
mapProducts.put(Product.Type.ENTERTAINMENT.name(), );
break;
case 4:
mapProducts.put(Product.Type.OTHER.name(), );
break;
}
import java.util.*;
public class Account {
private ArrayList<String> listOfPurchases;
private ArrayList<Double> itemPrice;
private ArrayList<Product> products;
private double balance;
private Scanner input = new Scanner(System.in);
private Map<String, ArrayList<Product>> mapProducts = new HashMap<>();
public Account() {
this.listOfPurchases = new ArrayList<>();
this.itemPrice = new ArrayList<>();
this.balance = 0.00d;
}
public void mainMenuPrint() {
System.out.println(
"Choose your action:\n" +
"1) Add income\n" +
"2) Add purchase\n" +
"3) Show list of purchases\n" +
"4) Balance\n" +
"0) Exit");
}
public void startMenu() {
Scanner input = new Scanner(System.in);
boolean isOn = true;
while (isOn) {
mainMenuPrint();
int choice = input.nextInt();
switch (choice) {
case 0:
System.out.println("Bye!");
isOn = false;
break;
case 1:
addIncome();
break;
case 2:
addPurchase();
break;
case 3:
showPurchases();
break;
case 4:
showBalance();
break;
}
}
}
public void addIncome() {
double addMoney = 0.00d;
System.out.println("Enter income:");
addMoney = input.nextDouble();
setBalance(addMoney);
System.out.println("Income was added!");
System.out.println("");
}
public void addPurchase() {
System.out.println(
"Choose the type of purchase\n" +
"1) Food\n" +
"2) Clothes\n" +
"3) Entertainment\n" +
"4) Other\n" +
"5) Back\n");
int choice = input.nextInt();
double price = 0.0d;
if (choice == 5) {
startMenu();
} else {
System.out.println("Enter purchase name:");
String item = input.next();
setListOfPurchases(item);
System.out.println("Enter its price:");
try {
price = input.nextDouble();
setItemPrice(price);
balanceSubtractFromPurchasePrice(price);
} catch (
InputMismatchException e) {
System.out.println("Wrong input");
}
switch (choice) {
case 1:
mapProducts.put(Product.Type.FOOD.name(),//add array);
break;
case 2:
mapProducts.put(Product.Type.CLOTHES.name(), );
break;
case 3:
mapProducts.put(Product.Type.ENTERTAINMENT.name(), );
break;
case 4:
mapProducts.put(Product.Type.OTHER.name(), );
break;
}
System.out.println("");
}
}
public void showPurchases() {
double sum = 0.0d;
if (mapProducts.size() == 0) {
System.out.println("The purchase list is empty");
} else {
System.out.println(
"Choose the type of purchase\n" +
"1) Food\n" +
"2) Clothes\n" +
"3) Entertainment\n" +
"4) Other\n" +
"5) All\n" +
"6) Back\n");
int choice = input.nextInt();
for (Map.Entry<String, ArrayList<Product>> entry : mapProducts.entrySet()) {
System.out.println(entry.getKey());
System.out.println(mapProducts.get("FOOD").get(0));
}
for (int i = 0; i < listOfPurchases.size(); i++) {
sum += itemPrice.get(i);
}
System.out.println("Total sum: $" + sum);
}
System.out.println("");
}
public void showBalance() {
System.out.printf("Balance: $%.2f", getBalance());
System.out.println("");
System.out.println("");
}
public void setBalance(double balanceAmount) {
this.balance += balanceAmount;
}
public void balanceSubtractFromPurchasePrice(double purchasePrice) {
this.balance -= purchasePrice;
}
public double getBalance() {
if (balance < 0) {
System.out.println("Balance is negative ");
}
return this.balance;
}
public void setListOfPurchases(String item) {
this.listOfPurchases.add(item);
}
public ArrayList<String> getListOfPurchases() {
return listOfPurchases;
}
public ArrayList<Double> getItemPrice() {
return itemPrice;
}
public void setItemPrice(double itemPrice) {
this.itemPrice.add(itemPrice);
}
}
public class Product {
enum Type {
FOOD, CLOTHES, ENTERTAINMENT, OTHER;
}
private String name;
private double price;
private Scanner input = new Scanner(System.in);
public Product(String name, double price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public double getPrice() {
return price;
}
}
感谢您的帮助!
你可以这样做:
ArrayList<Product> products = new ArrayList<>();
// add products to list
mapProducts.put(/*String*/, products);
与其将名称和价格保存在两个单独的列表中,不如创建一个产品并使用 computeIfAbsent
将其直接放入地图中。
System.out.println("Enter purchase name:");
String item = input.next();
System.out.println("Enter its price:");
try {
price = input.nextDouble();
balanceSubtractFromPurchasePrice(price);
// Lazy replacement for complicated switch case.
if(choice >= 1 && choice <= 4) {
Product.Type productType = Product.Type.values()[choice - 1];
Product product = new Product(item, price);
List<Product> products = mapProducts.computeIfAbsent(productType, k -> new ArrayList<>());
products.add(product);
} else {
System.out.println("Wrong input");
}
} catch (InputMismatchException e) {
System.out.println("Wrong input");
}
System.out.println("");
}
我正在做一个 Java 项目 - 预算经理,它显示了我如何花钱。
为此,我使用 Hashmap
来存储带有字符串(枚举)参数的购买类型,以及 Arraylist<Product>
。产品是新产品 class,其中要传递名称和价格。
如何将 ArrayList
中的多个值放入 HashMap
中的同一个键?
switch (choice) {
case 1:
mapProducts.put(Product.Type.FOOD.name(),//add array);
break;
case 2:
mapProducts.put(Product.Type.CLOTHES.name(), );
break;
case 3:
mapProducts.put(Product.Type.ENTERTAINMENT.name(), );
break;
case 4:
mapProducts.put(Product.Type.OTHER.name(), );
break;
}
import java.util.*;
public class Account {
private ArrayList<String> listOfPurchases;
private ArrayList<Double> itemPrice;
private ArrayList<Product> products;
private double balance;
private Scanner input = new Scanner(System.in);
private Map<String, ArrayList<Product>> mapProducts = new HashMap<>();
public Account() {
this.listOfPurchases = new ArrayList<>();
this.itemPrice = new ArrayList<>();
this.balance = 0.00d;
}
public void mainMenuPrint() {
System.out.println(
"Choose your action:\n" +
"1) Add income\n" +
"2) Add purchase\n" +
"3) Show list of purchases\n" +
"4) Balance\n" +
"0) Exit");
}
public void startMenu() {
Scanner input = new Scanner(System.in);
boolean isOn = true;
while (isOn) {
mainMenuPrint();
int choice = input.nextInt();
switch (choice) {
case 0:
System.out.println("Bye!");
isOn = false;
break;
case 1:
addIncome();
break;
case 2:
addPurchase();
break;
case 3:
showPurchases();
break;
case 4:
showBalance();
break;
}
}
}
public void addIncome() {
double addMoney = 0.00d;
System.out.println("Enter income:");
addMoney = input.nextDouble();
setBalance(addMoney);
System.out.println("Income was added!");
System.out.println("");
}
public void addPurchase() {
System.out.println(
"Choose the type of purchase\n" +
"1) Food\n" +
"2) Clothes\n" +
"3) Entertainment\n" +
"4) Other\n" +
"5) Back\n");
int choice = input.nextInt();
double price = 0.0d;
if (choice == 5) {
startMenu();
} else {
System.out.println("Enter purchase name:");
String item = input.next();
setListOfPurchases(item);
System.out.println("Enter its price:");
try {
price = input.nextDouble();
setItemPrice(price);
balanceSubtractFromPurchasePrice(price);
} catch (
InputMismatchException e) {
System.out.println("Wrong input");
}
switch (choice) {
case 1:
mapProducts.put(Product.Type.FOOD.name(),//add array);
break;
case 2:
mapProducts.put(Product.Type.CLOTHES.name(), );
break;
case 3:
mapProducts.put(Product.Type.ENTERTAINMENT.name(), );
break;
case 4:
mapProducts.put(Product.Type.OTHER.name(), );
break;
}
System.out.println("");
}
}
public void showPurchases() {
double sum = 0.0d;
if (mapProducts.size() == 0) {
System.out.println("The purchase list is empty");
} else {
System.out.println(
"Choose the type of purchase\n" +
"1) Food\n" +
"2) Clothes\n" +
"3) Entertainment\n" +
"4) Other\n" +
"5) All\n" +
"6) Back\n");
int choice = input.nextInt();
for (Map.Entry<String, ArrayList<Product>> entry : mapProducts.entrySet()) {
System.out.println(entry.getKey());
System.out.println(mapProducts.get("FOOD").get(0));
}
for (int i = 0; i < listOfPurchases.size(); i++) {
sum += itemPrice.get(i);
}
System.out.println("Total sum: $" + sum);
}
System.out.println("");
}
public void showBalance() {
System.out.printf("Balance: $%.2f", getBalance());
System.out.println("");
System.out.println("");
}
public void setBalance(double balanceAmount) {
this.balance += balanceAmount;
}
public void balanceSubtractFromPurchasePrice(double purchasePrice) {
this.balance -= purchasePrice;
}
public double getBalance() {
if (balance < 0) {
System.out.println("Balance is negative ");
}
return this.balance;
}
public void setListOfPurchases(String item) {
this.listOfPurchases.add(item);
}
public ArrayList<String> getListOfPurchases() {
return listOfPurchases;
}
public ArrayList<Double> getItemPrice() {
return itemPrice;
}
public void setItemPrice(double itemPrice) {
this.itemPrice.add(itemPrice);
}
}
public class Product {
enum Type {
FOOD, CLOTHES, ENTERTAINMENT, OTHER;
}
private String name;
private double price;
private Scanner input = new Scanner(System.in);
public Product(String name, double price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public double getPrice() {
return price;
}
}
感谢您的帮助!
你可以这样做:
ArrayList<Product> products = new ArrayList<>();
// add products to list
mapProducts.put(/*String*/, products);
与其将名称和价格保存在两个单独的列表中,不如创建一个产品并使用 computeIfAbsent
将其直接放入地图中。
System.out.println("Enter purchase name:");
String item = input.next();
System.out.println("Enter its price:");
try {
price = input.nextDouble();
balanceSubtractFromPurchasePrice(price);
// Lazy replacement for complicated switch case.
if(choice >= 1 && choice <= 4) {
Product.Type productType = Product.Type.values()[choice - 1];
Product product = new Product(item, price);
List<Product> products = mapProducts.computeIfAbsent(productType, k -> new ArrayList<>());
products.add(product);
} else {
System.out.println("Wrong input");
}
} catch (InputMismatchException e) {
System.out.println("Wrong input");
}
System.out.println("");
}