【问题标题】:Java: Is it possible to compare String values in two arrays, and if they match, increment an int value in the first array?Java:是否可以比较两个数组中的 String 值,如果它们匹配,则在第一个数组中增加一个 int 值?
【发布时间】:2019-05-07 10:26:47
【问题描述】:

我想通过添加一个由代表不同项目的String name, double price, int quantity 组成的数组来构建一个数组列表。如果添加的项与数组列表中已有的项相同,则应增加quantity 而不是添加。

我的想法是检查两个数组之间索引 1 的值是否匹配,如果匹配,则增加第一个数组中索引 3 的值。这是可以在Java中做的事情吗?您如何将新数组与列表中已有的数组进行比较?

【问题讨论】:

  • 是的,这是可能的,但不是你的方式。你觉得如何组合不同类型的数组?
  • 你真的需要一份清单吗?这不能是类中的字段吗?或者你有不同的“项目”?然后可能是项目对象列表?

标签: java arrays string arraylist


【解决方案1】:

啊,好吧...我编写代码时考虑了已经存在的答案(我很无聊)...

你在这里:

public class Helper {

    private static List<MyData> addNewData(List<MyData> listOfData, MyData myData) {

        for (int i = 0; i <= listOfData.size(); i++) {
            if (listOfData.get(i).getName().equalsIgnoreCase(myData.getName())) {
                listOfData.get(i).setQuantity(listOfData.get(i).getQuantity() + myData.getQuantity());
                break; //the data with the same name is found
            } else {
                listOfData.add(myData);
                break; //also necessary break!!!
            }

        }
        return listOfData;
    }

    private static void printData(List<MyData> myData){
        myData.forEach(System.out::println);
        System.out.println("______________________");
    }

    public static void main(String[] args) {

        //test data
        List<MyData> testData = new ArrayList<>();
        testData.add(new MyData("chair", 15.0, 44));
        testData.add(new MyData("bottle", 0.25, 119));


        System.out.println("Original data: "); printData(testData);
        //try to add new item (with new name)
        addNewData(testData, new MyData("glass", 1.1, 10));
        //print the new data
        System.out.println("New List: "); printData(testData);

        //try to add new 'existing' item
        addNewData(testData, new MyData("chair", 17.0, 4));
        //print the new - new data
        System.out.println("NEW new data: "); printData(testData);


    }

    static class MyData {

        private String name;
        private double price;
        private int quantity;

        //constructor without parameters
        public MyData() {
            this.setName("");
            this.setPrice(0.0d);
            this.setQuantity(0);
        }

        //constructor with parameters
        public MyData(String name, double price, int quantity) {
            this.setName(name);
            this.setPrice(price);
            this.setQuantity(quantity);
        }

        //getters, setters...
        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public double getPrice() {
            return price;
        }

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

        public int getQuantity() {
            return quantity;
        }

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

        @Override
        public String toString(){
            return this.name + ", " + this.price + ", " + this.quantity;
        }
    }
}

输出是:

Original data: 
chair, 15.0, 44
bottle, 0.25, 119
______________________
New List: 
chair, 15.0, 44
bottle, 0.25, 119
glass, 1.1, 10
______________________
NEW new data: 
chair, 15.0, 48
bottle, 0.25, 119
glass, 1.1, 10
______________________

请注意,椅子的价格没有变化(也可以这样做......)!

【讨论】:

    【解决方案2】:

    您可能应该检查您的模型并使用一个对象。

    创建一个包含三个属性的类。然后是Map&lt;String, YourObject&gt;。然后,当您想添加对象时,只需在之前进行测试

    if(map.containsKey(objectName)) {
        YourObject object = map.get(objectName);
        object.setQuantity(object.getQuantity() + 1);
    }
    

    编辑与@Eugene讨论后

    YourObject objectToAdd = ...
    Map<String, YourObject> map = new HashMap<>();
    ...
    YourObject objectInMap = map.get(objectName);
    if(objectInMap != null) {
        // increase Quantity in objectInMap 
    } else {
        //Object not existing in the map, never added
        //manage initial quantity here
        map.put(objectToAdd.getName(), objectToAdd)
    }
    

    【讨论】:

    • 为什么是Map 而不是Set
    • 使用地图可以直接查看对象的“标识符”,这里大概是名称。对于 Set 你必须重写 equals 方法以确保它不比较实例而是对象内部的特定值......更复杂,不一定干净
    • 有趣的是你说的是“更干净”,但是当你真的想要一个 get 时,显示一个使用 contains 的例子;否则我很难同意你的看法
    • 您正在以这种方式进行两次哈希查找,一次用于containsKey,一次用于get - 当你只能做get时,如果它返回null - 你没有, 如果它返回 != null - 你有它,所以只需更新它。之后无需致电put。在您看来,这使它更清洁......
    • 除此之外:一个不错的答案,所以请投票。感谢您省略了“如何真正做到这一点”部分;-)
    【解决方案3】:

    我同意其他答案:第 1 步是定义一个代表这样的SalesActivity 的类。

    但与其他人相比,我建议:将此类对象的所有字段设为最终字段。含义:当更多 X 商品售出时,而不是递增 amount 字段...只需创建一个 SalesActivity。

    而您只需将这些新对象添加到您的列表中即可。当你想知道“天哪,卖了多少 X”时,你只需迭代该列表,对于任何 X 条目,你添加 quantity 信息。

    当然,这不是您在新手练习中进行建模的方式。但这就是你应该在现实世界中做事的方式。您避免携带状态的对象。它就像你的银行账户:它不是一个改变其状态的对象。只不过是不断增加的一系列“账户活动”。换句话说:帐户对象中没有“帐户余额”字段。但是存款和付款的清单,余额只不过是所有这些事件在特定时间点的“总和”。

    【讨论】:

      【解决方案4】:

      正确的方法是构建一个 POJO 来保存这些值:

      class Purchase {
      
          String name;
          // all other
      
      }
      

      并用nameprice 覆盖equals/hashCode(不是quantity,因为这是一个可更新的字段),然后将这些实例放入Set 以进行快速搜索。其余的可能是显而易见的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多