Untitled
unknown
plain_text
2 years ago
16 kB
6
Indexable
import java.util.Scanner; import java.util.ArrayList; import java.util.List; import java.util.HashSet; import java.io.File; import java.io.FileNotFoundException; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.util.*; import java.lang.Double; class Member { private String name; private String member_type; private ArrayList<Message> sentMessages; private ArrayList<Message> receivedMessages; public ArrayList<Transaction> sentTransactions; public ArrayList<Transaction> receivedTransactions; public String getName() { return name; } public String getMemberType() { return member_type; } public int countMessagesSent() { return sentMessages.size(); } public int countMessagesReceived() { return receivedMessages.size(); } public int countTransactionsSent() { return sentTransactions.size(); } public int countTransactionsReceived() { return receivedTransactions.size(); } public void addSentMessages(Message message) { sentMessages.add(message); } public void addreceivedMessages(Message message) { receivedMessages.add(message); } public void addSentTransactions(Transaction transaction) { sentTransactions.add(transaction); } public void addreceivedTransactions(Transaction transaction) { receivedTransactions.add(transaction); } public double countAverageDelay() { double sum = 0; for (Transaction t : sentTransactions) { sum += t.getDelay(); } sum = (double) sum / sentTransactions.size(); return sum; } public double countSumDelay() { double sum = 0; for (Transaction t : sentTransactions) { sum += t.getDelay(); } return sum; } } class DriverCard { private String status; private String cardId; private String stateCode; private String lastName; private String firstName; private LocalDate dateOfBirth; public DriverCard(String cardId, String firstName, String lastName, String dateOfBirth, String stateCode, String cardStatus) { // Transform String to LocalDate // Local formatter = new SimpleDateFormat("yyyy/MM/dd"); // formatter.setLenient(false); // formatter.parse("2023/12/19"); this.status = cardStatus; this.cardId = cardId; this.stateCode = stateCode; this.lastName = lastName; this.firstName = firstName; this.dateOfBirth = LocalDate.parse(dateOfBirth); } public void setStatus(String status) { this.status = status; } public String getCardId() { return cardId; } } class Message { private Member sender; private Member receiver; private String content; public Message(Member sender, Member receiver, String content) { this.sender = sender; this.receiver = receiver; this.content = content; } } class Transaction { private Member sender; private Member replier; private Member administrator; private boolean isDelayed; private double delay; public Transaction(Member sender, Member replier, Member administrator, boolean isDelayed, double delay) { this.sender = sender; this.replier = replier; this.administrator = administrator; this.isDelayed = isDelayed; this.delay = delay; } public boolean getisDelayed() { return this.isDelayed; } public double getDelay() { return this.delay; } } public class TachoNetSystem { private static int num_of_member; private static int num_of_driver_card; private static int num_of_command; private static ArrayList<Member> members = new ArrayList<Member>(); private static ArrayList<DriverCard> driverCards = new ArrayList<DriverCard>(); private static Member initMember = new Member(); public static void main(String[] args) { // read input if (args.length == 0) { throw new ArrayIndexOutOfBoundsException("There is no input file."); } File fileObj = new File(args[0]); try { Scanner scan = new Scanner(fileObj); // read member input num_of_member = Integer.parseInt(scan.nextLine()); // check if [num_of_member] is nonnegative or not if (num_of_member < 0) { java.lang.System.out.println("Error"); } String member_type; String member_state_code; String member_name; for (int i = 0 ; i < num_of_member ; i++) { member_type = scan.next(); switch (member_type) { case "EnforcementAuthority": member_name = scan.next(); // members.add(new EnforcementAuthority()); break; case "Administrator": member_name = scan.next(); // members.add(new Administrator()); // administrators.add(new Administrator()); break; case "MemberState": member_state_code = scan.next(); member_name = scan.next(); // members.add(new MemberState()); break; default: // TODO java.lang.System.out.println("Error"); break; } } HashSet<String> driverCards_id = new HashSet<String>(); // read driver card input num_of_driver_card = Integer.parseInt(scan.nextLine()); // check if [num_of_driver_card] is nonnegative or not if (num_of_driver_card < 0) { java.lang.System.out.println("Error"); } String driver_card_id; String first_name; String last_name; String date_of_birth; String driver_member_state_code; String card_status; for (int i = 0 ; i < num_of_driver_card ; i++) { driver_card_id = scan.next(); // TODO // check driver_card_id first_name = scan.next(); last_name = scan.next(); date_of_birth = scan.next(); driver_member_state_code = scan.next(); card_status = scan.next(); driverCards.add(new DriverCard(driver_card_id, first_name, last_name, date_of_birth, driver_member_state_code, card_status)); } // read command input num_of_command = Integer.parseInt(scan.nextLine()); // check if [num_of_command_input] is nonnegative or not if (num_of_command < 0) { java.lang.System.out.println("Error"); } String command_type; for (int i = 0 ; i < num_of_command ; i++) { command_type = scan.next(); switch (command_type) { case "sendMessage": String sender_name = scan.next(); String receiver_name = scan.next(); String driverCardId = scan.next(); sendMessage(sender_name, receiver_name, driverCardId); break; case "countMessage": String memberName = scan.next(); String message_type = scan.next(); countMessage(memberName, message_type); break; case "transaction": String sender_name = scan.next(); String replier_name = scan.next(); String administrator_name = scan.next(); String is_successful = scan.next(); String delay = scan.next(); String delay_threshold = scan.next(); ArrayList<String> alert_receivers = new ArrayList<String>(); while (scan.hasNext()) { alert_receivers.add(scan.next()); } Transaction(sender_name, replier_name, administrator_name, is_successful, delay, delay_threshold, alert_receivers); break; case "getStatisticsOfUse": String member_name_1 = scan.next(); String member_name_2 = scan.next(); getStatisticsOfUse(member_name_1, member_name_2); break; case "getStandardDelayOfReplyByMember": String member_name_1 = scan.next(); String member_name_2 = scan.next(); getStandardDelayOfReplyByMember(member_name_1, member_name_2); break; case "getStandardDelayOfReplyByPeriod": String member_name = scan.next(); int start_id = Integer.parseInt(scan.next()); int end_id = Integer.parseInt(scan.next()); getStandardDelayOfReplyByPeriod(member_name, start_id, end_id); break; case "getPercentageOfUnsuccessfulTransaction": String member_name = scan.next(); getPercentageOfUnsuccessfulTransaction(member_name); break; case "addNewMember": break; default: // TODO java.lang.System.out.println("Error"); break; } } scan.close(); } catch (Exception ex) { } } private static void sendMessage(String sender_name, String receiver_name, String driver_card_id) { boolean foundSenderName = false; boolean foundReceiverName = false; boolean foundDriverCardId = false; Member sender = initMember; Member receiver = initMember; for (Member member : members) { if (member.getName() == sender_name) { foundSenderName = true; sender = member; break; } if (member.getName() == receiver_name) { foundReceiverName = true; receiver = member; break; } } for (DriverCard driverCard : driverCards) { if (driverCard.getCardId() == driver_card_id) { foundDriverCardId = true; break; } } // handle errors if (foundSenderName == false) { java.lang.System.out.println("Member " + sender_name + " does not exist"); return; } if (foundReceiverName == false) { java.lang.System.out.println("Member " + receiver_name + " does not exist"); return; } if (sender_name == receiver_name) { java.lang.System.out.println("Member " + sender_name + " cannot send messages to itself"); return; } if (foundDriverCardId == false) { java.lang.System.out.println("Driver card " + driver_card_id + " does not exist"); return; } // send message Message message = new Message(sender, receiver, driver_card_id); sender.addSentMessages(message); receiver.addreceivedMessages(message); } private static void countMessage(String member_name, String message_type) { boolean foundMemberName = false; Member member = initMember; for (Member m : members) { if (m.getName() == member_name) { foundMemberName = true; member = m; } } // handle errors if (foundMemberName == false) { java.lang.System.out.println("Member " + member_name + " does not exist"); return; } if (message_type != "SENT" || message_type != "RECEIVED") { java.lang.System.out.println("Illegal message type " + message_type); return; } // countMessage if (message_type == "SENT") { java.lang.System.out.println("Sent: " + member.countMessagesSent()); return; } else if (message_type == "RECEIVED") { java.lang.System.out.println("Sent: " + member.countMessagesReceived()); return; } } private static void Transaction(String sender_name, String replier_name, String administrator_name, String is_successful, String delay, String delay_threshold, ArrayList<String> alert_receivers) { Member sender = initMember; Member replier = initMember; Member admin = initMember; boolean foundSender = false; boolean foundReplier = false; boolean foundAdmin = false; for (Member m : members) { if (m.getName() == sender_name) { foundSender = true; sender = m; } if (m.getName() == replier_name) { foundReplier = true; replier = m; } if (m.getName() == administrator_name) { foundAdmin = true; admin = m; } } if (foundSender == false) { java.lang.System.out.println("Member " + sender_name + " does not exist"); return; } if (foundReplier == false) { java.lang.System.out.println("Member " + replier_name + " does not exist"); return; } if (foundAdmin == false) { java.lang.System.out.println("Member " + administrator_name + " does not exist"); return; } if (admin.getMemberType() != "administrator") { java.lang.System.out.println("Only administrators can administer a transaction"); return; } if (sender.getName() == replier.getName() || sender.getName() == admin.getName() || admin.getName() == replier.getName()) { java.lang.System.out.println("The sender, replier, and administrator should not be the same member."); return; } double delay_ = new Double(delay).doubleValue(); double delay_threshold_ = new Double(delay_threshold_).doubleValue(); if (delay_ > delay_threshold_) { for (String s : alert_receivers) { if (s == "sender") { java.lang.System.out.println("Alert sender " + sender_name + ": transaction is delayed"); } if (s == "replier") { java.lang.System.out.println("Alert replier " + replier_name + ": transaction is delayed"); } if (s == "administrator") { java.lang.System.out.println("Alert administrator " + administrator_name + ": transaction is delayed"); } } } sender.addSentTransactions(new Transaction(sender, replier, admin, delay_ > delay_threshold_, delay_)); receiver.addreceivedTransactions(new Transaction(sender, replier, admin, delay_ > delay_threshold_, delay_)); } // 4 private static void getStatisticsOfUse(String member_name_1, String member_name_2) { boolean foundMemberName1 = false; boolean foundMemberName2 = false; Member member1 = initMember; Member member2 = initMember; for (Member m : members) { if (m.getName() == member_name_1) { foundMemberName1 = true; member1 = m; } if (m.getName() == member_name_2) { foundMemberName2 = true; member2 = m; } } // handle errors if (foundMemberName1 == false) { java.lang.System.out.println("Member " + member_name_1 + " does not exist"); return; } if (foundMemberName2 == false) { java.lang.System.out.println("Member " + member_name_2 + " does not exist"); return; } if (member1.getMemberType() != "administrator") { java.lang.System.out.println("Only administrators can get standard delay of reply"); return; } // output java.lang.System.out.println("Transaction sent by " + member_name_2 + ": " + member2.countTransactionsSent()); java.lang.System.out.println("Transaction replied by " + member_name_2 + ": " + member2.countTransactionsReceived()); } // 5 private static void getStandardDelayOfReplyByMember(String member_name_1, String member_name_2) { boolean foundMemberName1 = false; boolean foundMemberName2 = false; Member member1 = initMember; Member member2 = initMember; for (Member m : members) { if (m.getName() == member_name_1) { foundMemberName1 = true; member1 = m; } if (m.getName() == member_name_2) { foundMemberName2 = true; member2 = m; } } // handle errors if (foundMemberName1 == false) { java.lang.System.out.println("Member " + member_name_1 + " does not exist"); return; } if (foundMemberName2 == false) { java.lang.System.out.println("Member " + member_name_2 + " does not exist"); return; } if (member1.getMemberType() != "administrator") { java.lang.System.out.println("Only administrators can get standard delay of reply"); return; } // delay java.lang.System.out.println("%.2f", "Average delay: " + member2.countAverageDelay()); } private static void getStandardDelayOfReplyByPeriod(String member_name, int start_id, int end_id) { boolean foundMemberName = false; Member member = initMember; for (Member m : members) { if (m.getName() == member_name) { foundMemberName = true; member = m; } } // handle errors if (foundMemberName == false) { java.lang.System.out.println("Member " + member_name + " does not exist"); return; } if (member.getMemberType() != "administrator") { java.lang.System.out.println("Only administrators can get standard delay of reply"); return; } if (end_id < start_id || start_id < 0 || ) { java.lang.System.out.println("Illegal period"); return; } double average_delay = member.countSumDelay() / (end_id - start_id + 1); java.lang.System.out.println("%.2f", "Average delay: " + average_delay); } }
Editor is loading...
Leave a Comment