当前位置: 首页 > 知识库问答 >
问题:

添加重复字符串的数量

傅自明
2023-03-14

我的任务是对一个类别列表进行排序。一份购物清单,如果你愿意的话。这些类别是来自用户的输入,要购买的物品。在输入所讨论的类别的字符串名称之后(当然是使用扫描器),用户可以输入该类别的数量(一个整数),然后输入该类别的单位成本(一个双倍)。系统会提示他们重复这一操作,直到他们命名的类别为“End”。

这一切都很好,而且我已经编写了代码来获取所有这些信息,找到并打印出最大的成本项、最大的数量项和其他信息。我需要帮助的是我的重复类别。例如,假设用户输入“cars”后跟一个整数3,后跟一个数字24000.00。然后输入“refigerators”,然后输入1和1300.00。然后用户放入第一个条目的副本,这个条目是“cars”,后面是一个整数5,后面是两个37000.00。我如何让我的代码重新访问旧的条目,将新的数量添加到旧的数量中,并存储该值而不重写旧的东西?我还需要找到清单中项目的最大平均成本。我是HashMap的新手,所以我正在努力处理代码://创建一个arrayList来存储值

              // create an arrayList to store values

            ArrayList<String> listOne = new ArrayList<String>();

            listOne.add("+ 1 item");

            listOne.add("+ 1 item");

            listOne.add("+ 1 item");



            // create list two and store values

            ArrayList<String> listTwo = new ArrayList<String>();

            listTwo.add("+1 item");

            listTwo.add("+1 item");



            // put values into map

            multiMap.put("some sort of user input detailing the name of the item", listOne);

            multiMap.put("some other input detailing the name of the next item", listTwo);
            // i need the user to input items until they type "end"

            // Get a set of the entries

            Set<Entry<String, ArrayList<String>>> setMap = multiMap.entrySet();

            // time for an iterator
            Iterator<Entry<String,  ArrayList<String>>> iteratorMap = setMap.iterator();        

           System.out.println("\nHashMap with Multiple Values");

            // display all the elements
                while(iteratorMap.hasNext()) {

                Map.Entry<String, ArrayList<String>> entry =

                        (Map.Entry<String, ArrayList<String>>) iteratorMap.next();

                String key = entry.getKey();

                List<String> values = entry.getValue();

              System.out.println("Key = '" + key + "' has values: " + values);

            }
    // all that up there gives me this: 

具有多个值的HashMap键=“详细说明下一项名称的某些其他输入”具有值:[+1项,+1项]键=“详细说明该项名称的某些用户输入”具有值:[+1项,+1项,+1项]

但是我还没有给用户一个输入物品数量或者费用的机会....我迷路了。

共有2个答案

常枫涟
2023-03-14

不是操作三个单独的值,而是创建一个名为item的类。实现comparable接口,这样,如果两个项目共享一个公共名称,它们就相等。有关定义接口的说明,请参阅Javadoc for Comparable。

public class Item implements Comparable { 
    [...] 
}

创建项目列表。

List<Item> shoppingList;

当要向列表中添加项时,请先检查列表中是否已经包含该项。

// If it's already in the list, add their quantities together
if (shoppingList.contains(newItem))
    shoppingList.get(newItem).quantity += newItem.quantity
// Otherwise, add it to the list
else
    shoppingList.add(newItem);
秦昊穹
2023-03-14

试试这一小段示例代码,它包括一个主类和两个依赖项类,StatsPrinter和ShoppingEntry

package com.company;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class Main {
    public static void main(String[] args) throws IOException {
        String category;
        String quantity;
        String value;

        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));

        HashMap<String, List<ShoppingEntry>> shoppingList = new HashMap<String, List<ShoppingEntry>>();

        while(true) {
            System.out.print("Enter the category of your item: ");
            category = bufferedReader.readLine();

            if("end".equals(category)){
                break;
            }

            System.out.print("Enter the quantity of your item: ");
            quantity = bufferedReader.readLine();

            System.out.print("Enter the value of your item: ");
            value = bufferedReader.readLine();

            if (shoppingList.containsKey(category)) {
                shoppingList.get(category).add(new ShoppingEntry(Integer.parseInt(quantity), Double.parseDouble(value)));
            }else{
                shoppingList.put(category, new ArrayList<ShoppingEntry>());
                shoppingList.get(category).add(new ShoppingEntry(Integer.parseInt(quantity),          Double.parseDouble(value)));
            }
        }

        StatsPrinter.printStatistics(shoppingList);
    }
}

和ShoppingEntry类

package com.company;

public class ShoppingEntry {
    private int quantity;
    private double price;

    public ShoppingEntry(){
        quantity = 0;
        price = 0;
    }

    public ShoppingEntry(int quantity, double price){
        this.quantity = quantity;
        this.price = price;
    }

    public int getQuantity() {
        return quantity;
    }

    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }
}

最后是StatsPrinter类,它利用ShoppingEntry的HashMap的数据结构来打印所需的统计信息

package com.company;

import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.List;

public class StatsPrinter {
    private static DecimalFormat format = new DecimalFormat("#.##");

    public static void printStatistics(HashMap<String, List<ShoppingEntry>> shoppingList) {
        printNuumberOfItems(shoppingList);
        printLargestValue(shoppingList);
        printLargestAverage(shoppingList);
    }

    private static void printNuumberOfItems(HashMap<String, List<ShoppingEntry>> shoppingList) {
         System.out.println("There are " + shoppingList.keySet().size() + " items in your Shopping List");
     }

    private static void printLargestValue(HashMap<String, List<ShoppingEntry>> shoppingList) {
        double currentLargestPrice = 0;
        String largestPriceCategory = new String();

        for(String keyValue : shoppingList.keySet()) {
            for(ShoppingEntry entry : shoppingList.get(keyValue)) {
                if (entry.getPrice() > currentLargestPrice) {
                    currentLargestPrice = entry.getPrice();
                    largestPriceCategory = keyValue;
                }
            }
        }

        System.out.println(largestPriceCategory + " has the largest value of: " +      format.format(currentLargestPrice));
     }

    private static void printLargestAverage(HashMap<String, List<ShoppingEntry>> shoppingList) {
        double currentLargestAverage = 0;
        String largestAverageCategory = new String();
        double totalCost = 0;
        int numberOfItems = 0;

        for(String keyValue : shoppingList.keySet()) {
            for(ShoppingEntry entry : shoppingList.get(keyValue)) {
                totalCost += entry.getPrice();
                numberOfItems += entry.getQuantity();
            }
            if((totalCost / numberOfItems) > currentLargestAverage) {
                currentLargestAverage = totalCost / numberOfItems;
                largestAverageCategory = keyValue;
            }
        }

        System.out.println(largestAverageCategory + " has the largest average value of: " +     format.format(currentLargestAverage));
    }
}
 类似资料:
  • 我只是有一个关于在JAVA中添加一些货币($)的问题,我使用NumberFormat.getMONcyInstance();以“$”获取我的输出。我的程序是输入一些钱(字符串格式),例如程序只接受(100美元、50美元、20美元...等等),所以我使用了这段代码: 如何获取输入(100.00、50.00…)以从总价中减去它们。。例如我想要(100.00-12.00)(12.00是总价) 任何帮助都

  • 我试图获取任意长度的字符串[],并将其打印成字符串,最好使用字段分隔符。现在我有: 但是由于某种原因,它只是返回“第二个”值。我如何使它正确连接这些值? 另外,我可以使用来简化代码吗?谢谢

  • 问题内容: 我是Java新手,所以我几乎不需要帮助 我有 我想向此数组(脚本)添加新的字符串(string1,string2)作为示例 我想在以后的阶段中不添加新字符串 我该怎么办? 问题答案: 您无法在Java中调整数组的大小。 声明数组的大小后,它将保持固定。 相反,您可以使用具有动态大小的对象,这意味着您无需担心其大小。如果数组列表的大小不足以容纳新值,则它将自动调整大小。

  • 嗨,我有这个同时循环。此输出变量是一个 String 变量,它保留 的输出。 假设< code>br.readLine())给出了2行。 所以将这些行打印为: 有人能告诉我如何在第一行的开头和最后一行的结尾添加吗?像这样: 我通过做这样的事情来尝试这个: 这在每行后面添加了一个括号。 请帮帮我。

  • 问题内容: 我正在制作一个基于Java中字符串处理的程序,其中需要从字符串数组中删除重复的字符串。在此程序中,所有字符串的大小均相同。 “数组”是一个字符串数组,其中包含许多字符串,其中两个字符串彼此相似。因此,使用下面的代码,必须删除重复的字符串,但是不能删除。 如何删除重复的字符串? 我正在使用以下代码。 问题答案: 这会工作 或者只使用a 而不是数组。

  • 我正在用Java制作一个基于字符串处理的程序,在这个程序中,我需要从字符串数组中删除重复的字符串。在这个程序中,所有字符串的大小都是相同的。 “数组”是一个字符串数组,包含许多字符串,其中两个字符串彼此相似。因此,使用下面的代码必须删除重复的字符串,但不会删除。 如何删除重复字符串? 我正在使用以下代码。