|
| 1 | +package com.javarush.task.task24.task2412; |
| 2 | + |
| 3 | +import java.text.ChoiceFormat; |
| 4 | +import java.text.Format; |
| 5 | +import java.text.MessageFormat; |
| 6 | +import java.text.SimpleDateFormat; |
| 7 | +import java.util.*; |
| 8 | + |
| 9 | +/* |
| 10 | +Знания - сила! |
| 11 | +*/ |
| 12 | + |
| 13 | +public class Solution { |
| 14 | + public static void main(String[] args) { |
| 15 | + List<Stock> stocks = getStocks(); |
| 16 | + sort(stocks); |
| 17 | + Date actualDate = new Date(); |
| 18 | + printStocks(stocks, actualDate); |
| 19 | + } |
| 20 | + |
| 21 | + public static void printStocks(List<Stock> stocks, Date actualDate) { |
| 22 | + SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy"); |
| 23 | + |
| 24 | + double[] filelimits = {0d, actualDate.getTime()}; |
| 25 | + String[] filepart = {"change {4}", "open {2} and last {3}"}; |
| 26 | + |
| 27 | + ChoiceFormat fileform = new ChoiceFormat(filelimits, filepart); |
| 28 | + Format[] testFormats = {null, null, dateFormat, fileform}; |
| 29 | + MessageFormat pattform = new MessageFormat("{0} {1} | {5} {6}"); |
| 30 | + pattform.setFormats(testFormats); |
| 31 | + |
| 32 | + for (Stock stock : stocks) { |
| 33 | + String name = ((String) stock.get("name")); |
| 34 | + String symbol = (String) stock.get("symbol"); |
| 35 | + double open = !stock.containsKey("open") ? 0 : ((double) stock.get("open")); |
| 36 | + double last = !stock.containsKey("last") ? 0 : ((double) stock.get("last")); |
| 37 | + double change = !stock.containsKey("change") ? 0 : ((double) stock.get("change")); |
| 38 | + Date date = (Date) stock.get("date"); |
| 39 | + Object[] testArgs = {name, symbol, open, last, change, date, date.getTime()}; |
| 40 | + System.out.println(pattform.format(testArgs)); |
| 41 | + } |
| 42 | + } |
| 43 | + |
| 44 | + public static void sort(List<Stock> list) { |
| 45 | + list.sort(new Comparator<Stock>() { |
| 46 | + public int compare(Stock stock1, Stock stock2) { |
| 47 | + int compare; |
| 48 | + return (compare = compareName(stock1, stock2)) != 0 ? compare |
| 49 | + : (compare = compareDate(stock1, stock2)) != 0 ? compare |
| 50 | + : compareProfit(stock1, stock2); |
| 51 | + } |
| 52 | + |
| 53 | + private int compareName(Stock stock1, Stock stock2) { |
| 54 | + String name1 = ((String) stock1.get("name")); |
| 55 | + String name2 = ((String) stock2.get("name")); |
| 56 | + return name1.compareTo(name2); |
| 57 | + } |
| 58 | + |
| 59 | + private int compareDate(Solution.Stock stock1, Solution.Stock stock2) { |
| 60 | + long oneDay = 24 * 60 * 60 * 1000; |
| 61 | + Long d1 = ((Date) stock1.get("date")).getTime() / oneDay; |
| 62 | + Long d2 = ((Date) stock2.get("date")).getTime() / oneDay; |
| 63 | + return d2.compareTo(d1); |
| 64 | + } |
| 65 | + |
| 66 | + private int compareProfit(Stock stock1, Stock stock2) { |
| 67 | + int profit1 = getProfitPercentage(stock1); |
| 68 | + int profit2 = getProfitPercentage(stock2); |
| 69 | + return profit2 - profit1; |
| 70 | + } |
| 71 | + |
| 72 | + private int getProfitPercentage(Stock stock) { |
| 73 | + double res; |
| 74 | + if (stock.containsKey("change")) { |
| 75 | + res = !stock.containsKey("change") ? 0 : ((double) stock.get("change")); |
| 76 | + } else if (stock.containsKey("open") && stock.containsKey("last")) { |
| 77 | + double open = ((double) stock.get("open")); |
| 78 | + double last = ((double) stock.get("last")); |
| 79 | + res = last - open; |
| 80 | + } else { |
| 81 | + throw new RuntimeException("Incorrect data"); |
| 82 | + } |
| 83 | + |
| 84 | + return (int) (res * 1000); |
| 85 | + } |
| 86 | + }); |
| 87 | + } |
| 88 | + |
| 89 | + public static class Stock extends HashMap<String, Object> { |
| 90 | + public Stock(String name, String symbol, double open, double last) { |
| 91 | + put("name", name); |
| 92 | + put("symbol", symbol); |
| 93 | + put("open", open); |
| 94 | + put("last", last); |
| 95 | + put("date", getRandomDate(java.time.LocalDate.now().getYear() + 1)); |
| 96 | + } |
| 97 | + |
| 98 | + public Stock(String name, String symbol, double change, Date date) { |
| 99 | + put("name", name); |
| 100 | + put("symbol", symbol); |
| 101 | + put("date", date); |
| 102 | + put("change", change); |
| 103 | + } |
| 104 | + } |
| 105 | + |
| 106 | + public static List<Stock> getStocks() { |
| 107 | + List<Stock> stocks = new ArrayList<>(); |
| 108 | + |
| 109 | + stocks.add(new Stock("Fake Apple Inc.", "AAPL", 125.64, 123.43)); |
| 110 | + stocks.add(new Stock("Fake Cisco Systems, Inc.", "CSCO", 25.84, 26.3)); |
| 111 | + stocks.add(new Stock("Fake Google Inc.", "GOOG", 516.2, 512.6)); |
| 112 | + stocks.add(new Stock("Fake Intel Corporation", "INTC", 21.36, 21.53)); |
| 113 | + stocks.add(new Stock("Fake Level 3 Communications, Inc.", "LVLT", 5.55, 5.54)); |
| 114 | + stocks.add(new Stock("Fake Microsoft Corporation", "MSFT", 29.56, 29.72)); |
| 115 | + |
| 116 | + stocks.add(new Stock("Fake Nokia Corporation (ADR)", "NOK", .1, getRandomDate())); |
| 117 | + stocks.add(new Stock("Fake Oracle Corporation", "ORCL", .15, getRandomDate())); |
| 118 | + stocks.add(new Stock("Fake Starbucks Corporation", "SBUX", .03, getRandomDate())); |
| 119 | + stocks.add(new Stock("Fake Yahoo! Inc.", "YHOO", .32, getRandomDate())); |
| 120 | + stocks.add(new Stock("Fake Applied Materials, Inc.", "AMAT", .26, getRandomDate())); |
| 121 | + stocks.add(new Stock("Fake Comcast Corporation", "CMCSA", .5, getRandomDate())); |
| 122 | + stocks.add(new Stock("Fake Sirius Satellite", "SIRI", -.03, getRandomDate())); |
| 123 | + |
| 124 | + return stocks; |
| 125 | + } |
| 126 | + |
| 127 | + public static Date getRandomDate() { |
| 128 | + return getRandomDate(1970); |
| 129 | + } |
| 130 | + |
| 131 | + public static Date getRandomDate(int startYear) { |
| 132 | + int year = startYear + (int) (Math.random() * 30); |
| 133 | + int month = (int) (Math.random() * 12); |
| 134 | + int day = (int) (Math.random() * 28); |
| 135 | + GregorianCalendar calendar = new GregorianCalendar(year, month, day); |
| 136 | + return calendar.getTime(); |
| 137 | + } |
| 138 | +} |
| 139 | + |
0 commit comments