Чтение ввода из файла и подсчет вхождения в Java - PullRequest
0 голосов
/ 04 сентября 2018

Я новичок в Java. Пожалуйста, помогите решить проблему ниже.

У меня есть входной файл, как упомянуто ниже, со значениями в следующем порядке, разделенными запятыми: «id, invoiceNumber, custid, totalamt, amountdue». Мне нужно выяснить, у кого есть сумма, подлежащая выплате> 1000. Если один custid повторяется несколько раз, имея dueamt> 1000, тогда мне нужно распечатать номер ожидающих платежей.

*Input file :
102,12545,111,10000,5000
103,12546,111,10300,4000
104,12545,110,10000,2000*

*Output in the console:
cust id : 111
No of pending due payment ; 2
Total due amount : 9000
cust id : 110
No of pending due payment ; 1
Total due amount : 2000*

Я нахожусь в процессе кода ниже, но не понял

public static void main(String[] args) throws FileNotFoundException, IOException 
    {

        String line = null;
        Long custid;
        Double dueamt;
        int count = 1;
        Double newdue;
        Map<Long,Map> hashmap = new TreeMap<>();
        Invoice invoiceobj = null;
        try(BufferedReader br1 = new BufferedReader(new FileReader("input.txt")))
        {
            while((line = br1.readLine()) != null)
            {
                invoiceobj = new Invoice();
                String[] detailsarr = line.split(",");
                invoiceobj.setId(Long.parseLong(detailsarr[0]));
                invoiceobj.setInvoiceNumber(detailsarr[1]);
                invoiceobj.setCustomerId(Long.parseLong(detailsarr[2]));
                custid = Long.parseLong(detailsarr[2]);
                invoiceobj.setTotalAmount(Double.parseDouble(detailsarr[3]));
                invoiceobj.setAmountDue(Double.parseDouble(detailsarr[4]));
                dueamt = Double.parseDouble(detailsarr[4]);

                if(hashmap.containsKey(custid))
                {
                    Map<Double,Integer> hashmap2 = hashmap.get(custid);
                    newdue = olddue + dueamt;
                    count++;
                    hashmap2.put(newdue, count);



                }
                else
                {
                Map<Double,Integer> hashmap1 = new TreeMap<>(); 
                hashmap1.put(dueamt, 1);
                hashmap.put(custid, hashmap1);
                }
    }

            for(Map.Entry<Long,Double> entry : hashmap2.entrySet())
            {
                Long custid1 = entry.getKey();
                Double amt = entry.getValue();



                if(amt>1000)
                {
                System.out.println("Customer id "+custid1);

                System.out.println("Number of invoice pending for payment:"+count);

                System.out.println("Total Due Amount: $"+amt);
                }


            }

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Вы можете сделать это очень легко, и вам не понадобятся две или более карты, если вы используете Multimap в своем коде. Multimap позволяет вам хранить несколько значений (здесь это будет несколько dueamt для одного custid) на одном и том же ключе, а затем повторять их, чтобы добавить нужную сумму. Также вам не нужно подсчитывать суммы и просто проверять количество значений для каждого ключа, чтобы содержать счет-фактуры. Подробнее о Multimap есть здесь .

Импортировать как:

import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap;

public static void main( String[] args ) throws FileNotFoundException, IOException {
    String line = null;
    Long custid;
    Double dueamt;
    Multimap< Long, Double > hashmap = ArrayListMultimap.create( );

    try (BufferedReader br1 = new BufferedReader( new FileReader( "input.txt" ) )) {

        while ( ( line = br1.readLine( ) ) != null ) {

            String[] detailsarr = line.split( "," );
            Long invoiceID = Long.parseLong( detailsarr[ 0 ] );
            String invoiceNumber = detailsarr[ 1 ];
            custid = Long.parseLong( detailsarr[ 2 ] );
            Double totalAmount = Double.parseDouble( detailsarr[ 3 ] );
            dueamt = Double.parseDouble( detailsarr[ 4 ] );
            if ( dueamt > 1000.00 ) {
                hashmap.put( custid, dueamt );
            }
        }
    }
    for ( Long key: hashmap.keySet( ) ) {
        System.out.println( "CustomerId " + key );
        System.out.println( "Number of invoice pending for payment:" + hashmap.get( key ).size( ) );
        System.out.println( "Total Due Amount: $" + hashmap.get( key ).stream( ).mapToDouble( Double::doubleValue ).sum( ) );
    }
}

Выход:

CustomerId 110
Number of invoice pending for payment:1
Total Due Amount: $2000.0
CustomerId 111
Number of invoice pending for payment:2
Total Due Amount: $9000.0
0 голосов
/ 04 сентября 2018

Вы также можете улучшить свою логику, сохранив идентификатор клиента, причитающуюся сумму на одной карте и идентификатор клиента, считая на другой.

Map<Long,Double> map1 = new TreeMap<>();
 Map<Long,Integer> map2 = new HashMap<>();
 if(map1.containsKey(custid)){
    Double currDue = map1.get(custid);
    currDue+=dueAmt;
    map1.put(custid,currDue);
    map2.put(custid,map2.get(custid)+1);
} else {
    map1.put(custid,dueAmt);
    map2.put(custid,1);
}

Наконец, просто переберите набор записей map1 и проверьте, если значение> 1000, затем получите счет из map2, используя тот же ключ.

...