为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

守着一只汪 2022-10-20 17:18:45
我正在使用 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;    }}我希望打印一天,但打印了很多没有意义的数字
查看完整描述

3 回答

?
DIEA

TA贡献1820条经验 获得超2个赞

我认为你正在尝试做这样的事情:


        Map<String,Double> alreadyMade = new HashMap<>();

    for (Tips tips : new ArrayList<Tips>()) {

        // If this time doesn't exist in the map then add it to the map with the

        // value tips.getTips().  If this time does exist in the map then add 

        // the value of tips.getTips() to the value that is already in the map.

        alreadyMade.merge(tips.getTime(), tips.getTips(), (Double a, Double b) -> a + b);

    }

    // go through each map entry.  The keys are the times and the values are the tip totals for that time.

    for (Map.Entry<String, Double> entry : alreadyMade.entrySet()) {

        System.out.println("Time: " + entry.getKey() + " Tips: " + entry.getValue());

    }

注意:我无法对此进行测试,因为我正在运行 Java 7,并且此地图功能在 Java 8 之前不可用。


查看完整回答
反对 回复 2022-10-20
?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

在 Java 8+ 中,您可以使用流 API 按时间分组:

Map<Date, Integer> alreadyMade = data.getTips().stream()
  .collect(groupingBy(Tip::getTime, summingInt(Tip::getTips)));


查看完整回答
反对 回复 2022-10-20
?
www说

TA贡献1775条经验 获得超8个赞

我会这样做:


这是你的提示课(我认为)


public class Tip{

    Date date;

    float tip;

    public Tip(Date date, float tip){

        this.date = date;

        this.tip = tip;

    }

}

这就是(“算法”)


//To Format the Dates

SimpleDateFormat ft = new SimpleDateFormat("dd-MM-yyyy");


//Input

ArrayList<Tip> tips = new ArrayList<Tip>();


//Just some Data for testing

tips.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));




//Output

ArrayList<Date> dates = new ArrayList<Date>();

ArrayList<Float> sum = new ArrayList<Float>();


for(Tip tip : tips){  //Go through each Tip

  int match = dates.indexOf(tip.date);  //Look if the date is already in the array (if not -> -1)


  if(match == -1){  //If not add it

    dates.add(tip.date);

    sum.add(tip.tip);

  }else {  //If yes set it

    sum.set(match, sum.get(match) + tip.tip);

  }


}


//Output to console

for(int i = 0; i < dates.size(); i++){

  System.out.println(ft.format(dates.get(i)).toString() + " " + String.valueOf(sum.get(i)));

}

还有一个带有地图或配对的解决方案,但我从未使用过它们(不是专业编码器)。还要确保尝试捕获 ParseException。我希望这就是你的意思。:)


查看完整回答
反对 回复 2022-10-20
  • 3 回答
  • 0 关注
  • 96 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信