Java программа для сортировки списка дат в формате дд МММ гггг - PullRequest
0 голосов
/ 12 октября 2018

Ввод - это список, содержащий дату в формате String.У меня есть решение, как показано ниже.Но я чувствую, что это можно сделать более эффективным.Мы будем благодарны за любую помощь.

// Карта для хранения данных за месяц

HashMap<String,String> month = new HashMap<String,String>();
        month.put("Jan","01");
        month.put("Feb","02");
        month.put("Mar","03");
        month.put("Apr","04");
        month.put("May","05");
        month.put("Jun","06");
        month.put("Jul","07");
        month.put("Aug","08");
        month.put("Sep","09");
        month.put("Oct","10");
        month.put("Nov","11");
        month.put("Dec","12");

Вы можете рассматривать это как ввод

    String[] input = {"20 Oct 2052",
    "26 May 1960",
    "06 Jun 1933",
    "06 Jun 1933",
    "06 Jun 1933",
};


    ArrayList<Long> temp1 = new ArrayList<Long>();

Для сравнения результата

    HashMap<Long,String> temp2 = new HashMap<Long,String>();

    ArrayList<String> result = new ArrayList<String>();
    for(int i = 0 ; i< input.length ; i++){
        String j = "";
        if(input[i].length() == 11){

            j+= input[i].substring(7,11);
            j+= month.get(input[i].substring(3,6));
            j+=input[i].substring(0,2);

            temp1.add(Long.parseLong(j));
            temp2.put(Long.parseLong(j), input[i]);   
        }
    }

Сортировка результата

Collections.sort(temp1);

Печать результата

System.out.println(temp1.toString());

Ответы [ 5 ]

0 голосов
/ 13 октября 2018

tl; dr

Это однострочник, использующий современные java.time классы и лямбда-синтаксис.

Разобрать каждую строку в LocalDate, собирать, сортировать и регенерировать строки как выходные данные.

Arrays.stream(
        new String[] { "20 Oct 2052" , "26 May 1960" , "06 Jun 1933" , "06 Jun 1933" , "06 Jun 1933" }
)
        .map( input -> LocalDate.parse( input , DateTimeFormatter.ofPattern( "dd MMM uuuu" , Locale.US ) ) )
        .sorted()
        .map( date -> date.format( DateTimeFormatter.ofPattern( "dd MMM uuuu" , Locale.US ) ) )
        .collect( Collectors.toList() )
        .toString()

[06 июня 1933 г., 06 июня 1933 г., 06 июня 1933 г.,26 мая 1960 г., 20 октября 2052 г.]

Шаги:

  • Создать поток элементов вашего массива (строковые входы).
  • Обработать каждый входСинтаксический анализ для получения LocalDate
  • Сортировка LocalDate объектов
  • На каждом LocalDate, сгенерируйте текст, представляющий его значение.
  • Соберите каждую из этих сгенерированных строкв List.
  • Генерация текста, представляющего список строк, теперь отсортированных в хронологическом порядке.

Смарт-объекты, а не немые строки

Использовать соответствующие данныетипы, а не просто строки.

Для значения только на дату без времени суток и без часового пояса используйте LocalDate class.

Определите шаблон форматирования, соответствующий вашим вводам.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd MMM uuuu" , Locale.US );

Зацикливание входов, анализируя каждый в LocalDate.Соберите каждый полученный LocalDate в List.

    List < LocalDate > dates = new ArrayList <>( inputs.length );
    for ( String input : inputs ) {
        LocalDate ld = LocalDate.parse( input , f );
        dates.add( ld );
    }

Или вместо этого используйте короткий и сладкий лямбда-синтаксис.

List < LocalDate > dates = Arrays.stream( inputs ).map( input -> LocalDate.parse( input , f ) ).collect( Collectors.toList() );

Сортируйте список LocalDate объектов.

Collections.sort( dates );

Сообщите о своем отсортированномдаты в стандартном формате ISO 8601.

String outputs = dates.toString() ;

[1933-06-06, 1933-06-06, 1933-06-06, 1960-05-26, 2052-10-20]

Сообщите отсортированные даты в любом желаемом формате.

   List < String > outputs = new ArrayList <>( dates.size() );
    for ( LocalDate date : dates ) {
        outputs.add( date.format( f ) );
    }

[06 июня 1933 г., 06 июня 1933 г., 06 июня 1933 г., 26 мая 1960 г., 20 октября 2052 г.]


О java.time

В Java встроен фреймворк java.time 8 и позже.Эти классы заменяют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .

Вы можете обмениваться java.time объектами напрямую с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

  • Java SE 8 , Java SE 9 , Java SE 10, Java SE 11 и более поздние версии - часть стандартного Java API с связанной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и JavaSE 7
    • Большая часть функций java.time перенесена на Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии пакетов Android для реализации java.time классы.
    • Для более ранних версий Android (<26) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .

ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти некоторые полезные классы, такие как Interval, YearWeek, YearQuarter и more .

0 голосов
/ 12 октября 2018

Это должно сработать

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd MMM yyyy");

List<Date> dates = Arrays.stream(input).map(dateString -> {
try {
    return simpleDateFormat.parse(dateString);
} catch (ParseException e) {
    e.printStackTrace();
}
    return null;
}).collect(Collectors.toList());
dates.sort(Comparator.naturalOrder());

dates.forEach(date -> System.out.println(simpleDateFormat.format(date)));

это двухэтапный процесс

  1. Преобразовать в java.util.Date
  2. Сортировать список дат иПечать

Надеюсь, это поможет!

Удачи!

0 голосов
/ 12 октября 2018

Сначала я бы проанализировал строки даты в объекте Date

DateFormat format = new SimpleDateFormat("dd MMM yyyy", Locale.ENGLISH);
Date date = format.parse("26 May 1960");

Вы можете создать объект, который содержит объект Date, а затем сделать его сопоставимым.

public class DateContainer implements Comparable<DateContainer > {
 private Date dateTime;

 public DateContainer (Date date){
  this.dateTime = date;
 }

 public Date getDateTime() {
  return dateTime;
 }

 public void setDateTime(Date datetime) {
  this.dateTime = datetime;
 }

 @Override
 public int compareTo(DateContainer o) {
   return getDateTime().compareTo(o.getDateTime());
 }
}

Тогда вы можетесоздайте список объекта выше, а затем используйте коллекции, чтобы отсортировать его

Collections.sort(myList);
0 голосов
/ 12 октября 2018
public static void main(String[] args) {
    SimpleDateFormat f = new SimpleDateFormat("dd MMM yyyy");
    String[] input = {"20 Oct 2052",
            "26 May 1960",
            "06 Jun 1933",
            "06 Jun 1933",
            "06 Jun 1933",
    };
    Map<Long, String> result = new TreeMap<>();
    Stream.of(input)
            .filter(s -> s.length() == 11)
            .forEach(s -> {
                try {
                    result.put(f.parse(s).getTime(), s);
                } catch (ParseException e) {
                    System.out.println("Wrong Format: " + s);
                }
            });
    System.out.println(result); // {-1154156400000=06 Jun 1933, -303033600000=26 May 1960, 2612970000000=20 Oct 2052}
}

Используйте SimpleDateFormat для получения значения Date и TreeMap для отсортированных элементов на карте.

Надеюсь, что это поможет вам !!!!

0 голосов
/ 12 октября 2018

Radix Sort ваш друг.Просто отсортируйте строки с помощью этого алгоритма.Это оптимальное решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...