Round 3 - Data Parsing

mail@pastecode.io avatar
unknown
plain_text
3 years ago
3.4 kB
1
Indexable
Never



/* Your manager has asked you to devise a quick program that will parse an input file containing usage data for your service and output information of the user with the most usage for a provided time period. In particular he is interested in the human-friendly name, the unique id, and the total usage of that user in the time period. The file format is:

Name,ID,Usage,Year,Month,Day

e.g.
Bob Wiley,123456789,90.0,2021,10,03
Frodo Baggins,987654321,50.0,2021,10,05
Frodo Baggins,987654321,50.0,2021,10,06

If your program would run with a time range of 2021-10-01 to 2021-10-05, it would return information about the Bob user who had the most usage. However, if you ran your program for a time range of 2021-10-01 to 2021-10-06, it would return information about the Frodo user.

Invalid Records:
Bob Wiley,90.0,2021,10,03
Frodo Baggins,987654321,50.0,2023,10,06
*/
import java.util.Date;

public class Person {
    
    String name;
    String id;
    
    public Person(String name, String id) {
        this.name = name;
        this.id = id;
    }
}

public class Record {
    Person person;
    double usage;
    
    public Record(Person person, double usage) {
        this.person = person;
        this.usage = usage;
    }
}

public class Main {
    Map<Date, List<Record>> recordsByDate;
    
    public Main(){
        this.recordsByDate = new HashMap<>();
    }
    
    // Assumption: All records are valid
    public void parseRecords(List<String> records) {
        for (String record: records) {
            List<String> entries = record.split(",");
            Date date = toTimestamp(entries.getItem(3), entries.getItem(4), entries.getItem(5));
            Person person = new Person(entries.getItem(0), entries.getItem(1));
            Record parsedRecord = new Record(person, entries.getItem(2));
            
            List<Record> currentRecords = recordsByDate.getOrDefault(date, new ArrayList<>());
            currentRecords.add(parsedRecord);
            recordsByDate.put(date, currentRecords);
        }
    }
    
    public Date toTimestamp(int year, int month, int day) {
        Date date = new Date(year, month, day);
        return date;
    }
    
    public Person mostUsage(Date startDate, Date endDate) {
        int startDays = startDate.getDay();  // number days
        int endDays = endDate.getDay();
        int numberOfDays = startDays - endDays;
        
        Map<Person, Double> usageMap = new HashMap<>();
        
        for (int i = startDays; i <= endDays; i++) {
            Date day = new Date(startDays); // Assumption: constructor takes in day to convert number of days to Date
            
            List<Record> records = recordsByDate.getOrDefault(day, new ArrayList<>());
            for (Record record:records) {
                Double usage = usageMap.getOrDefault(record.person, 0);
                usage += record.usage;
                usageMap.put(record.person, usage);
            }
        }
        
        Double max = 0.0;
        Person person;
        for (MapEntry<Person, Double> entry : usageMap.keySet()) {
            double currentUsage = entry.value;
            Person currentPerson = entry.key;
            
            if (currentUsage > max) {
                max = currentUsage;
                person = currentPerson;
            }
        }
        
        return person;
    }
}