使用 foreach 将 arrayList 与自身进行比较,不包括重复项

我正在使用 foreach 将 arrayList 与自身进行比较。我有一个包含服务员提示的arrayList,每个对象都有一个日期“dd-MM-yyy”和一个金额(双倍),现在我想添加同一天的所有交易,所以我可以得到当天的总数在服务员之间分配。没有重复。我已经特别在这里查看了所有内容,但我似乎无法找到解决方案。我真的希望你们能帮忙,我知道这有点尴尬,因为问题很简单,但我已经研究了几天了,我被卡住了。


我有一个更长的算法,但它不起作用,我在网上找不到任何解决方案,所以我把它分解成最基本的组件并检查每个步骤,很早就出现了这个问题:我正在使用本地数组列表,以确保我不会一遍又一遍地比较同一天。if(!alreadyMade.contains(tips1.getTime()) 后跟 alreadyMade.add(tips1.getTime()) 似乎正在产生重复,在我看来这没有任何意义。我想要的只是添加所有交易同一天从同一个arrayList。


公共无效dist(){


    double day = 0;

    List<String> alreadyMade = new ArrayList<>();

    for (Tips tips : data.getTips()) {

        for (Tips tips1 : data.getTips()) {

            if(tips.getTime().equals(tips1.getTime())) {

                if (!alreadyMade.contains(tips1.getTime())){

                    alreadyMade.add(tips1.getTime());

                    day += tips.getTips();

                }

            }

        }

        System.out.println(day);

        day = 0;

    }

}

我希望打印一天,但打印了很多没有意义的数字


守着一只汪
浏览 97回答 3
3回答

DIEA

我认为你正在尝试做这样的事情:&nbsp; &nbsp; &nbsp; &nbsp; Map<String,Double> alreadyMade = new HashMap<>();&nbsp; &nbsp; for (Tips tips : new ArrayList<Tips>()) {&nbsp; &nbsp; &nbsp; &nbsp; // If this time doesn't exist in the map then add it to the map with the&nbsp; &nbsp; &nbsp; &nbsp; // value tips.getTips().&nbsp; If this time does exist in the map then add&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; // the value of tips.getTips() to the value that is already in the map.&nbsp; &nbsp; &nbsp; &nbsp; alreadyMade.merge(tips.getTime(), tips.getTips(), (Double a, Double b) -> a + b);&nbsp; &nbsp; }&nbsp; &nbsp; // go through each map entry.&nbsp; The keys are the times and the values are the tip totals for that time.&nbsp; &nbsp; for (Map.Entry<String, Double> entry : alreadyMade.entrySet()) {&nbsp; &nbsp; &nbsp; &nbsp; System.out.println("Time: " + entry.getKey() + " Tips: " + entry.getValue());&nbsp; &nbsp; }注意:我无法对此进行测试,因为我正在运行 Java 7,并且此地图功能在 Java 8 之前不可用。

慕田峪9158850

在 Java 8+ 中,您可以使用流 API 按时间分组:Map<Date,&nbsp;Integer>&nbsp;alreadyMade&nbsp;=&nbsp;data.getTips().stream() &nbsp;&nbsp;.collect(groupingBy(Tip::getTime,&nbsp;summingInt(Tip::getTips)));

www说

我会这样做:这是你的提示课(我认为)public class Tip{&nbsp; &nbsp; Date date;&nbsp; &nbsp; float tip;&nbsp; &nbsp; public Tip(Date date, float tip){&nbsp; &nbsp; &nbsp; &nbsp; this.date = date;&nbsp; &nbsp; &nbsp; &nbsp; this.tip = tip;&nbsp; &nbsp; }}这就是(“算法”)//To Format the DatesSimpleDateFormat ft = new SimpleDateFormat("dd-MM-yyyy");//InputArrayList<Tip> tips = new ArrayList<Tip>();//Just some Data for testingtips.add(new Tip(ft.parse("11-04-2019"), 2.40F));tips.add(new Tip(ft.parse("25-04-2019"), 3.30F));tips.add(new Tip(ft.parse("25-04-2019"), 0.90F));//OutputArrayList<Date> dates = new ArrayList<Date>();ArrayList<Float> sum = new ArrayList<Float>();for(Tip tip : tips){&nbsp; //Go through each Tip&nbsp; int match = dates.indexOf(tip.date);&nbsp; //Look if the date is already in the array (if not -> -1)&nbsp; if(match == -1){&nbsp; //If not add it&nbsp; &nbsp; dates.add(tip.date);&nbsp; &nbsp; sum.add(tip.tip);&nbsp; }else {&nbsp; //If yes set it&nbsp; &nbsp; sum.set(match, sum.get(match) + tip.tip);&nbsp; }}//Output to consolefor(int i = 0; i < dates.size(); i++){&nbsp; System.out.println(ft.format(dates.get(i)).toString() + " " + String.valueOf(sum.get(i)));}还有一个带有地图或配对的解决方案,但我从未使用过它们(不是专业编码器)。还要确保尝试捕获 ParseException。我希望这就是你的意思。:)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java