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

时间:2019-04-25 15:40:36

标签: java arraylist compare

我正在使用foreach将arrayList与自身进行比较。 我有一个arrayList,其中包含服务生的提示,每个对象都有一个日期“ dd-MM-yyy”和一个金额(双精度), 现在,我想添加同一天的所有交易,因此我得到了当天的总计,可以在服务员之间分配。 没有重复。 我到处都看过了,尤其是在这里,但是我似乎找不到解决方法。 我真的希望你们能帮上忙,我知道这有点令人尴尬,因为问题是如此简单,但是我已经研究了几天,但遇到了麻烦。

我有一个更长的算法,但是它无法工作,而且我无法在线找到任何解决方案,因此我将其分解为最基本的组件,并检查了每个步骤,并且很早就解决了这个问题: 我使用的是本地arrayList,以确保我不会一遍又一遍地比较同一天。 如果if(!alreadyMade.contains(tips1.getTime())紧跟已经afterMade.add(tips1.getTime())似乎正在产生重复项,在我看来这是没有意义的。 我想要的就是从同一arrayList添加同一天的所有交易。

public void 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 个答案:

答案 0 :(得分:0)

我认为您正在尝试执行以下操作:

        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才可用。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我会像下面这样:

这是您的Tip课(我认为)

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。我希望那是你的意思。 :)