Skip to content

Commit f9be477

Browse files
committed
Task2412
1 parent bc591e2 commit f9be477

2 files changed

Lines changed: 159 additions & 0 deletions

File tree

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
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+
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
taskKey="com.javarush.task.task24.task2412"\n\nЗнания - сила!
2+
3+
1. В методе sort написать компаратор для Stock:
4+
1.1. Первичная сортировка по name в алфавитном порядке
5+
1.2. Вторичная сортировка по дате без учета часов, минут, секунд (сверху самые новые), потом по прибыли от положительных к отрицательным
6+
... open 125,64 and last 126,74 - тут прибыль = 126,74-125,64
7+
... open 125,64 and last 123,43 - тут прибыль = 123,43-125,64
8+
2. Разобраться с *Format-ами и исправить IllegalArgumentException. Подсказка - это одна строчка.
9+
Пример вывода:
10+
Fake Apple Inc. AAPL | 16-03-2027 open 125,64 and last 123,43
11+
Fake Applied Materials, Inc. AMAT | 15-01-1983 change 0,26
12+
13+
14+
Требования:
15+
1. Во время работы программы не должны возникать исключения.
16+
2. Программа должна выводить данные на экран.
17+
3. Метод sort должен корректно сортировать полученный список в соответствии с условием задачи.
18+
4. Класс Solution.Stock должен быть публичным.
19+
20+

0 commit comments

Comments
 (0)