public    Map<Integer, Integer> withdrawAmount(int expectedAmount) throws NotEnoughMoneyException {

        Map<Integer, Integer> withdraw = new HashMap<>(); // мапа, которую будет отдавать клиенту

        int sum = 0; // сумма, которую набираем

        int ostatok = expectedAmount; // сколько осталось набрать

        ArrayList<Integer> arrayList = new ArrayList();

        for (Map.Entry<Integer, Integer> pair : denominations.entrySet())

        { arrayList.add(pair.getKey()); } // забрали в лист все купюры

        Collections.sort(arrayList); // сделали сортировку

        int i = arrayList.size()-1; // начинаем анализ с конца (т.к. сортировка от меньшего к большему)

        boolean posibility = false; //показывает, возможно ли набрать данную сумму или нет

        while (true) { // первый цикл проверяет возможно ли в целом набрать данную сумму,
        //здесь никаких операций с мапой

            int current = arrayList.get(i); // взяли старшую купюру

            int ammaxcup = denominations.get(current); // взяли количество купюр

            int k = ostatok/current; // посмотрели сколько целых купюр вмещается

            if(k<ammaxcup) { sum = sum + k*current;  } // если у нас есть столько или больше, то берем эти купюры

            else { sum = sum + current*ammaxcup; } // если нет, то зибираем все какие есть

            ostatok = expectedAmount - sum; // считаем сколько осталось набрать

            if (ostatok==0) { ostatok = expectedAmount; i = arrayList.size()-1; sum = 0;

            posibility=true; break;} // если набрать удалось, то делаю posibility=true и обнуляю переменные,
            //т.к. дальше будет делаться тоже самое, но уже с действиями над мапой

            i = i - 1; //идем на следующую купюру

            if(i<0) { // если дошли до конца лист и сумма не набралась,
                           // значит невозможно набрать такую сумму
                throw new NotEnoughMoneyException();} }


        if(posibility) { while (true) { // все тоже самое, но уже делаю манипуляции надо мапой
            int current = arrayList.get(i);
            int ammaxcup = denominations.get(current);
            int k = ostatok / current;
            if (k < ammaxcup) {
                sum = sum + k * current;
                if (k!=0) {
                withdraw.put(current,k);} // положил в мапу купюры
                denominations.put(current, ammaxcup - k); //забираю купюры из банкомата
            } else {
                sum = sum + current * ammaxcup;
                withdraw.put(current,ammaxcup);
                denominations.remove(current); //забираю купюры из банкомата
            }
            ostatok = expectedAmount - sum;
            if (ostatok == 0)  {
                System.out.println("Сумма выдана");
                break;}
            i = i - 1; } }
        return withdraw;
}
В общем, валидацию прошло, но код не совсем нравится, т.к. делаю одно и тоже 2 раза + создается много шелухи типа листов и т.д. Да и в целом - многа букаф. Есть идеи, что можно укоротить и как сделать код лучше (быстрей и менее прожорливым) ? Буду благодарен за идеи!