package com.javarush.task.task24.task2412;
import java.text.ChoiceFormat;
import java.text.Format;
import java.text.MessageFormat;
import java.text.SimpleDateFormat;
import java.util.*;
/*
Знания - сила!
*/
public class Solution {
public static void main(String[] args) {
List<Stock> stocks = getStocks();
sort(stocks);
Date actualDate = new Date();
printStocks(stocks, actualDate);
}
public static void printStocks(List<Stock> stocks, Date actualDate) {
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
//double[] filelimits = {0d, actualDate.getTime()};
//String[] filepart = {"closed {4}", "open {2} and last {3}"};
double[] filelimits = {0d, actualDate.getTime()}; // минимальные значения
String[] filepart = {"closed {4}", "open {2} and last {3}"}; // строки, выбираемые в случае превышения мин. значения
ChoiceFormat fileform = new ChoiceFormat(filelimits, filepart);
// ChoiceFormat fileform = new ChoiceFormat(filelimits, filepart);
Format[] testFormats = {null, null,dateFormat, fileform};
MessageFormat pattform = new MessageFormat("{0} {1} | {5} {6}");
pattform.setFormats(testFormats);
for (Stock stock : stocks) {
String name = ((String) stock.get("name"));
String symbol = (String) stock.get("symbol");
double open = !stock.containsKey("open") ? 0 : ((double) stock.get("open"));
double last = !stock.containsKey("last") ? 0 : ((double) stock.get("last"));
double change = !stock.containsKey("change") ? 0 : ((double) stock.get("change"));
Date date = (Date) stock.get("date");
Object[] testArgs = {name, symbol, open, last, change, date, date.getTime()};
System.out.println(pattform.format(testArgs));
}
}
public static void sort(List<Stock> list) {
Collections.sort(list, new Comparator<Stock>() {
public int compare(Stock stock1, Stock stock2) {
String name1= (String)stock1.get("name");
String name2= (String)stock2.get("name");
if(name1.compareToIgnoreCase( name2)==0){
Date date1 = (Date) stock1.get("date");
Date date2 = (Date) stock2.get("date");
int dateCompare = date1.compareTo(date2);
if(dateCompare==0){
double change1 = !stock1.containsKey("change") ? ((double)stock1.get("last")-(double)stock1.get("open")): ((double) stock1.get("change"));
double change2 = !stock2.containsKey("change") ? ((double)stock2.get("last")-(double)stock2.get("open")): ((double) stock2.get("change"));
if(change1<change2)
return 1;
if(change2<change1)
return -1;
if(change2==change1)
return 0;
}else{
return -dateCompare;
}
}
return name1.compareToIgnoreCase( name2);
}
});
}
public static class Stock extends HashMap {
public Stock(String name, String symbol, double open, double last) {
put("name", name);
put("symbol", symbol);
put("open", open);
put("last", last);
put("date", getRandomDate(2020));
}
// public Stock(String name, String symbol, double open, double last, Date date) {
// put("name", name);
// put("symbol", symbol);
// put("open", open);
// put("last", last);
// put("date", date);
// }
public Stock(String name, String symbol, double change, Date date) {
put("name", name);
put("symbol", symbol);
put("date", date);
put("change", change);
}
}
public static List<Stock> getStocks() {
List<Stock> stocks = new ArrayList();
stocks.add(new Stock("Fake Apple Inc.", "AAPL", 125.64, 123.43));
stocks.add(new Stock("Fake Apple Inc.", "AAPL", 125.64, 123.43, new Date(1984, 05, 25)));
stocks.add(new Stock("Fake Apple Inc.", "AAPL", 125.64, 100,new Date(1984, 05, 25)));
stocks.add(new Stock("Fake Apple Inc.", "AAPL", 125.64, 100.0));
stocks.add(new Stock("Fake Cisco Systems, Inc.", "CSCO", 25.84, 26.3));
stocks.add(new Stock("Fake Google Inc.", "GOOG", 516.2, 512.6));
stocks.add(new Stock("Fake Intel Corporation", "INTC", 21.36, 21.53));
stocks.add(new Stock("Fake Level 3 Communications, Inc.", "LVLT", 5.55, 5.54));
stocks.add(new Stock("Fake Microsoft Corporation", "MSFT", 29.56, 29.72));
stocks.add(new Stock("Fake Nokia Corporation (ADR)", "NOK", .1, getRandomDate()));
stocks.add(new Stock("Fake Oracle Corporation", "ORCL", .15, getRandomDate()));
stocks.add(new Stock("Fake Starbucks Corporation", "SBUX", .03, getRandomDate()));
stocks.add(new Stock("Fake Yahoo! Inc.", "YHOO", .32, getRandomDate()));
//
stocks.add(new Stock("Fake Yahoo! Inc.", "YHOO", -.15, new Date(1984, 05, 25)));
stocks.add(new Stock("Fake Yahoo! Inc.", "YHOO", -.10, new Date(1984, 05, 25)));
//
stocks.add(new Stock("Fake Applied Materials, Inc.", "AMAT", .26, getRandomDate()));
stocks.add(new Stock("Fake Comcast Corporation", "CMCSA", .5, getRandomDate()));
stocks.add(new Stock("Fake Sirius Satellite", "SIRI", -.03, getRandomDate()));
return stocks;
}
public static Date getRandomDate() {
return getRandomDate(1970);
}
public static Date getRandomDate(int startYear) {
int year = startYear + (int) (Math.random() * 30);
int month = (int) (Math.random() * 12);
int day = (int) (Math.random() * 28);
GregorianCalendar calendar = new GregorianCalendar(year, month, day);
return calendar.getTime();
}
}Evgeniy JK
31 уровень
Здравствуйте, не подскажете в чем проблема? Не проходит валидатор. Добавил конструктор( закомментил), чтобы сравнить при одинаковой дате.. Все равно нет. Спасибо.
Решен
Комментарии (3)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Максим Кобыляков
9 июля 2018, 05:28
не нужно игноре кейза а так этот метод сортировки принимает
0
Вадим Науменко
6 июня 2018, 13:55решение
compareToIgnoreCase поменяйте на compareTo
+3
Artem
3 июня 2018, 23:26
Сам метод сортировки не смотрел.
Могу только сказать, что может не приниматься валидатором из-за того, что вы поменяли данные ,которые были в других методах. Рекомендую скопировать метод сортировки, сбросить задачу в дефолт, вставить скопированный метод обратно и снова отправить на проверку.
Если проверку все равно не пройдет - покопаюсь поглубже в реализации самого метода сортировки.
0