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

如何检查arrayList中的项是否已经存在,并在Java中添加计数?

何安宜
2023-03-14

假设我有一个类Groceries(name,quantity),该类用于一个名为shoppingList的数组列表。

   ArrayList<Groceries> shoppingList = new ArrayList<>();

项目的名称和数量将存储在此数组列表中。即将添加到此arrayList中的项目已存在,但数量不同。如何通过绕过现有名称的名称,只向现有名称添加数量来避免重复?

这是我的代码,我还没有完成:它应该从数据文件中读取

add,3,loaf of bread
add,2,jug of milk
list
buy,2,loaf of bread
add,4,loaf of bread
buy,3,jug of milk

import java.io.*;
import java.util.ArrayList;
public class A3Q1 {
    public static void main(String[] args){
        BufferedReader input;
        String line;
        String command, name;
        int quantity;
        //Groceries name;
        String tokens[];

        ArrayList<Groceries> shoppingList = new ArrayList<>();
        ArrayList<Groceries> purchaseList = new ArrayList<>();
        Groceries grocery;


        try{
            input = new BufferedReader(new FileReader("a3a.txt"));
            line = input.readLine();
            while(line!= null){
                tokens = line.split(",");
                command = tokens[0].trim();
                quantity = Integer.parseInt(tokens[1].trim());
                name = tokens[2].trim();

                if (command.equals("add")){
                    shoppingList.add(new Groceries(quantity,name));
                    if (command.equals("buy")){
                        purchaseList.add(new Groceries(quantity,name));
                    }
                }

            }

        }catch(IOException ioe){
            System.out.println(ioe.getMessage());
        }
    }
}

class Groceries {
    private String name;
    private int quantity;


    public Groceries( int quantity, String name){
        this.name =name;
        this.quantity=quantity;
    }


}

要求的所需经费;

作为程序输入的数据文件将由包含三个命令之一的行组成。第一个命令是add,后面跟着数量和商品名称,用逗号分隔。这将添加到购物清单中;如果具有该名称的商品已经存在,增加给定数字所需的数量。否则,用该名称和数量向列表中添加一个新商品。第二个命令是Buy,后面也跟着数量和商品名称。这将以类似的方式添加到购买清单中。此外,如果具有该名称的商品已经在购物清单中,减少该数字所需的数量。如果该商品的数量达到零(或更少),则将其从购物清单中删除。最后,list命令应该打印出两个清单,同时显示数量和商品名称,每行一个商品。例如,数据文件:

共有3个答案

梁丘诚
2023-03-14

您可以使用ArrayListindexOf(Object o)方法获取列表中杂货店的索引,如果它返回有效值(即大于-1),则使用get(int index)检索杂货店对象,并增加/替换其数量。

我不知道您的Groceries类的实现细节,但您应该注意,如果您为相同的杂货(即具有相同的名称)创建一个新的Groceries对象,并且您没有覆盖equals(Object obj)(可能还有hashCode()< /code>方法,因为"相等的对象必须具有相等的哈希代码")方法,您将永远不会在列表中找到重复的对象,因为这些对象正在与它们的equals方法进行比较。

如果您真的只想存储Groceries对象,并强制同一对象中只能有一个在列表中,那么您应该使用集合HashSet)。请记住,您必须重写equalshashCode

孙承弼
2023-03-14

使用HashMap代替:

Map<String, Integer> shoppingList = new HashMap<>();
shoppingList.put("Eggs", 1);

// Add more
if(shoppingList.containsKey("Eggs")){
  shoppingList.put("Eggs", shoppingList.get("Eggs") + 5);
}

您现在可以轻松地访问特定的杂货,避免重复。当然,如果您的杂货类超过“名称”属性,您也可以使用它来代替字符串

廉元龙
2023-03-14

好吧,由于您希望使用ArrayList,而不是与HashMap或其他键值类混合,您需要使用循环检查杂货店是否存在,如果存在,则需要删除它并添加一个数量增加的新类。

你也有一些代码错误,请学习下面的代码并试着理解它。这是最好的学习方式!不仅仅是复制粘贴;)

import java.io.*;
import java.util.ArrayList;

public class A3Q1 {
    public static void main(String[] args){
        BufferedReader input;
        String line;
        String command, name = null;
        int quantity = 0;
        //Groceries name;
        String tokens[];

        ArrayList<Groceries> shoppingList = new ArrayList<>();
        ArrayList<Groceries> purchaseList = new ArrayList<>();
        Groceries grocery = null;


        try{
            input = new BufferedReader(new FileReader("a3a.txt"));
            line = input.readLine();
            while(line!= null){
                tokens = line.split(",");
                command = tokens[0].trim();

                if(command.equals("list")) {
                  System.out.println("shoppingList " + shoppingList);
                  System.out.println("purchaseList " + purchaseList);
                  System.out.println("");
                } else {
                  quantity = Integer.parseInt(tokens[1].trim());
                  name = tokens[2].trim();
                }

                if (command.equals("add")) {
                  boolean added = false;
                  for (int i=0; i<shoppingList.size(); i++) {
                    Groceries g = (Groceries) shoppingList.get(i);
                    if( g.getName().equals(name) ){
                      shoppingList.remove(g);
                      quantity += g.getQuantity();
                      g.setQuantity(quantity);
                      shoppingList.add(g);
                      added = true;
                      break;
                    }
                  }
                  if( !added ) {
                    shoppingList.add(new Groceries(quantity,name));
                  }
                }
                if (command.equals("buy")) {
                  for (int i=0; i<shoppingList.size(); i++) {
                    Groceries g = (Groceries) shoppingList.get(i);
                    if( g.getName().equals(name) ){
                      shoppingList.remove(g);
                      if( g.getQuantity() - quantity > 0 ) {
                        g.setQuantity(g.getQuantity() - quantity);
                        shoppingList.add(g);
                      } else {
                        //quantity = g.getQuantity(); //removed this as you wanted to keep the purchaselist this way
                      }
                      break;
                    }
                  }

                  boolean added = false;
                  for (int i=0; i<purchaseList.size(); i++) {
                    Groceries g = (Groceries) purchaseList.get(i);
                    if( g.getName().equals(name) ){
                      purchaseList.remove(g);
                      quantity += g.getQuantity();
                      g.setQuantity(quantity);
                      purchaseList.add(g);
                      added = true;
                      break;
                    }
                  }
                  if( !added ) {
                    purchaseList.add(new Groceries(quantity,name));
                  }
                }
                line = input.readLine();
            }

        }catch(IOException ioe){
            System.out.println(ioe.getMessage());
        }
    }
}

class Groceries {
    private String name;
    private int quantity;


    public Groceries( int quantity, String name){
        this.name =name;
        this.quantity=quantity;
    }

    public String getName() {
      return name;
    }

    public int getQuantity() {
      return quantity;
    }

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

    public String toString() {
      return quantity + ", " + name;
    }
}

a3a。txt

add,3,bread
list
add,2,milk
list
buy,2,bread
list
add,4,bread
list
buy,3,milk
list
buy,1,butter
list

(我假设list是一个显示列表的命令)

输出

shoppingList [3, bread]
purchaseList []

shoppingList [3, bread, 2, milk]
purchaseList []

shoppingList [2, milk, 1, bread]
purchaseList [2, bread]

shoppingList [2, milk, 5, bread]
purchaseList [2, bread]

shoppingList [5, bread]
purchaseList [2, bread, 3, milk]

shoppingList [5, bread]
purchaseList [2, bread, 3, milk, 1, butter]
 类似资料:
  • 问题内容: 如何检查扫描仪中写入的值是否存在? 问题答案: 只需使用ArrayList.contains(desiredElement)即可。例如,如果您要从示例中查找conta1帐户,则可以使用以下方法: 编辑: 请注意,为了使其正常工作,您将需要适当地重写equals()和hashCode()方法。如果使用的是Eclipse IDE,则可以通过首先打开对象的源文件并选择来生成这些方法。

  • 我想检查一下总线号码是否已经存在于Firebase的数据库中。 这是我的示例代码。我一直在搜索过去的日子,但我不能找到正确的代码这样做。 有人能帮我处理这件事吗?提前道谢。不管if语句是否正确,我的问题还在于为什么...不起作用?我试图测试一些吐司消息,但消息不会弹出。

  • 我需要验证表中是否已经存在列。我的类扩展了CustomTaskChange,因此我的方法接收一个数据库对象作为参数。我可以通过ResultSetObject进行我想要的验证吗?

  • 问题内容: 在Java 8中,检查List是否包含重复项的最佳方法是什么? 我的想法是这样的: 这是最好的方法吗? 问题答案: 您的代码将需要遍历所有元素。如果要确保没有重复的简单方法,例如 会更有效,因为它可以在找到第一个非唯一元素时立即为您提供。 此方法也可以重写为(假设非并行流和线程安全的环境),使用该方法也很短路(对于不满足所提供条件的第一个元素,立即返回false)

  • 问题内容: 我是JDBC的新手,我想找出是否有一种方法可以检查MySQL中是否已经存在特定的数据库。 假设我想创建一个名为students的数据库,如果已经在MySQL中创建了students数据库,则eclipse中的错误消息将指出该students数据库已经存在。但是,我想做的是创建一个布尔方法来检查学生数据库是否已经存在。如果存在,则布尔方法将返回false,否则返回true,那么我可以创建

  • 问题内容: 在打开文件以Java读取之前,如何检查文件是否存在?(相当于Perl的)。 关于SO的唯一类似问题涉及写入文件,因此使用回答了该问题,这显然不适用于此处。 如果可能的话,我宁愿使用真正的API调用返回,而不是使用“调用API来打开文件并在引发异常时捕获并在文本中检查’无文件’的情况下捕获”,但是我可以接受后者。 问题答案: 使用: