Сравнение arrayList с самим собой, используя foreach и не включая дубликаты - PullRequest
0 голосов
/ 25 апреля 2019

Я сравниваю arrayList с самим собой, используя foreach.У меня есть arrayList, содержащий советы для официантов, у каждого объекта есть дата "dd-MM-гггг" и сумма (двойная). Теперь я хочу добавить все транзакции за один день, поэтому я получаю итоговую сумму за день, который можетбыть разделенным между официантами.Без дубликатов.Я осмотрел все, особенно здесь, но я не могу найти решение.Я действительно надеюсь, что вы, ребята, можете помочь, я знаю, что это немного неловко, потому что проблема настолько проста, но я работаю над этим уже пару дней, и я застрял.

ЯУ меня был более длинный алгоритм, но он не работал, и я не мог найти какие-либо решения в Интернете, поэтому я разбил все это на его основные компоненты и проверил для каждого шага, и довольно рано возникла эта проблема: я использую локальныйarrayList, чтобы убедиться, что я не сравниваю одни и те же дни снова и снова.Кажется, что if (!readyMade.contains (tips1.getTime ()), за которым следует ужеMade.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 голосов
/ 25 апреля 2019

В Java 8+ вы можете использовать потоковый API для группировки по времени:

Map<Date, Integer> alreadyMade = data.getTips().stream()
  .collect(groupingBy(Tip::getTime, summingInt(Tip::getTips)));
0 голосов
/ 25 апреля 2019

Я бы сделал это следующим образом:

Это ваш класс 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. Надеюсь, это то, что вы имели в виду. :)

0 голосов
/ 25 апреля 2019

Я думаю, вы пытаетесь сделать что-то вроде этого:

        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.

...