• 0

[JAVA] Sorting a set of dates


Question

Hi,

I have a hashmap with filenames as the keys and the related text as its values.

For example:-

Key - mar_2007

Value - March 2007

Key - jun_2008

Value - June 2008

And more like this including variations like may_apr_2008...

How can I sort this data in reverse chronological order i.e latest first...

Please help me with your suggestions.

Link to comment
https://www.neowin.net/forum/topic/681522-java-sorting-a-set-of-dates/
Share on other sites

14 answers to this question

Recommended Posts

  • 0

I think you're gonna have to convert the texts into proper Date vales in order to sort chronologically.

Things like "June 2008" are easy (use SimpleDateFormat), but you will need to code something yourself to cope with "may_apr_2008" (whatever that means!).

  • 0

I'd create a date structure, out it in an ArrayList and then create a comparator and the do Collection.sort();

do a google search on java comparator and collection.sort

public class MyDate implements Comparator{

private int year;

private int month;

... getters and setters, constructor, eqauls()

}

MyDate myDate= new MyDate(1,2006);

myArray.add(myDate);

... etc

myArray.sort(myArray);

  • 0
I'd create a date structure, out it in an ArrayList and then create a comparator and the do Collection.sort();

Date implements Comparable, so you can sort them without having to create a Comparator (unless you want something other than a strictly chronological sort)

  • 0
true, but he isnt specifying a day, guess you could set it to 1... he wants it reversed ... so maybe extend date and override compare and reverse the compare value?

Yes. SimpleDateFormat allows you to parse dates that have things (eg day) missing, so that's OK.

As for the reversed sort... I like your idea - it's almost a one-liner

public int compareTo(Date d) { return - super.compareTo(Date d)}

Its the parsing of the "more like this including variations like may_apr_2008..." that worries me!

  • 0

changed mind :)

my above suggestion is not really good design at all :( - poor seperation of behaviour. You should take a mix of my advice and James.

so here is some example code - seperate out sort behaviour from the object

public class ReverseDateComparator implements Comparator {

	public int compareTo(Date a, Date b) { 
		return - a.compareTo(b)
	}
}

your main
{
   ArrayList<Date> dateList = new ArrayList()

  .. add dates to the list
   dateList.add(new Date());
   .....

  Collection.sort(dateList, new ReverseDateComparator());
}

  • 0

Thanks JamesCherrill and _kane81 :)

I used your ideas and found another solution(may sound wierd)...

My requirement was to get a map with actual filenames as the key and the clean formatted text as the value which is sorted in the chronological order.

for example:-

key = may_2008

value = May 2008

key = mar_16_23_2008

value = May 16-23 2008

key = aug_sep_2007

value = August-September 2007

This must be sorted so that latest docs will be on top. The factor that worried me is the different combinations that can come in the filename part.

Using your suggestions, I extracted a string out of the filename. If the day was specified,I'll use it. Or else I'll put 1 as the day. For month, I took the first month appearing in the name.

Then I parsed it to create a Date object from this string.

I used a TreeMap to store the dates so that it'll be sorted

TreeMap dateList = new TreeMap(Collections.reverseOrder());

The keys were the Date objects and values were the filenames.

I used a LinkedHashMap to retrieve the filenames from the TreeMap.Using a function I formatted the filenames as text to be displayed.

Now the LinkedHashMap contains keys as the filenames and values as the text to be displayed.

Is this a good solution? Or any other optimized solutions are available?

Please put your suggestions.

  • 0

^

hadnt seen "TreeMap(Collections.reverseOrder());" before...

not sure what you are doing there....

I think your solutions sounds fine... however why do you keep using a map? maps are good/quick for lookups on a key. if you just want an ordered list, an arraylist (vector if thread safety is req) would be a better choice as it is more efficent in sorting/ordered stuff.

edit: ok so your keeping a file name link as key... guess thats ok... either that or create a class that encapsulates a date and file name or maybe an actual link to the file....

ie

public class MyFile implements comparable{

File file;

Date date;

public MyFile(File file) {

setFile(file);

}

public void setFile(File file) {

this.file = file;

do some code to parse file name to date

this.date = .....

}

public int compareTo(MyFile file) {

return this.file.getDate().compareTo(file.getDate());

}

}

Edited by _kane81
  • 0

Thanks _kane81 for the valuable inputs.

The existing scenario resembles something like this - in a jsp page, function call is made to get the filenames and the display text. The function is written in a java file and it will return the data in a map.

Now this sorting problem came up and I had to find a solution that will not disrupt the existing system very much.

I used hashMap because I thought it was the best solution. Anyways I need the filenames and the display text built from this filename. By using a Map I can get both with just a single function call.

TreeMap(Collections.reverseOrder()); --> This is a quick solution to reverse the order in Tree Map. As you know, TreeMap sorts in the natural ordering of keys or ascending order. Collections.reverseOrder() will reverse it easily...so I get reverse sorted filename list. Ofcourse it can be done using Comparable interface but this is a very easy and handy solution :) and its working fine...

And I used LinkedHashMap so that the order is preserved as in TreeMap. Thus I can use filenames as keys and display text as values and can be sure that the order is same as the sorted order in TreeMap...

  • 0

Sorry to ressurect this thread but i have a similar problem and wonder if anyone can give me some advices or suggestions.

I am using this method to create a date.

public String getDate() {

Calendar cal = Calendar.getInstance();

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");

return sdf.format(cal.getTime());

}

Then i store the DATE as the key and a USER object as the value in a Hashmap. Now i will like to sort the KEY (which is the date) with the latest date at the top.

How can i do this? please advice..

Thanks~

  • 0

Oh no! I just realised that i can't do that. Because the date MAY NOT be unique hence cannot be used as a key!

Anyone can give me some suggestions please? Actually the USER object does contain the date. So is there a way i can sort the USER OBJECT according to the dates but calling user.getDate() from the USER OBJECT and maybe store in an arraylist of USER object?

  • 0

i want to sort set of csv files named with dates

like my filename is

beno_hawai_enc_01-Aug-2009.csv

beno_hawai_enc_03-Aug-2009.csv

beno_hawai_enc_02-Aug-2009.csv

how to read these files in sorted order based on filename please give me some ide its very urgent my email id is [email protected]

thank you

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • I'd say the first one failed to be as popular as Apple anticipated, but the easy adjustment here is to make fewer of them next time around. It would only be a "flop" if it isn't possible for Apple to recover the design and factory tooling costs given the number of units sold, which I doubt would be the case. It isn't like no one bought them; it just failed to become the new hot phone of the year.
    • You're right that it does not follow the plain meaning of the word, but in this context, it is a legal term defined in 49 U.S.C. Kind of how "wire fraud" laws apply even if a physical wire was not used. Given that it is codified in law, and it isn't just automotive journalists that don't understand evolving technology, I highly doubt congress would change a well understood term just because technology makes the term slightly less actuate.
    • This is exactly why I keep saying we are not ready for human free self-driving. These little "bugs" are may seem like random one-offs. There was also the Waymo that drove between police with drawn weapons and the suspect they were pointing them at. From a software perspective it is easy to understand how those extremely rare situations may not have been programed for, but that is the point. If AI needs to be told to watch out for every possible contingency, then it can never be successful. There will always be the possibility of a first encounter that the AI needs to understand to avoid.
    • TeraCopy 4.0 Final by Razvan Serea TeraCopy is a compact program designed to copy and move files at the maximum possible speed, also providing you with a lot of features. Copy files faster. TeraCopy uses dynamically adjusted buffers to reduce seek times. Asynchronous copy speeds up file transfer between two physical hard drives. Pause and resume transfers. Pause copy process at any time to free up system resources and continue with a single click. Error recovery. In case of copy error, TeraCopy will try several times and in the worse case just skips the file, not terminating the entire transfer. Interactive file list. TeraCopy shows failed file transfers and lets you fix the problem and recopy only problem files. Shell integration. TeraCopy can completely replace Explorer copy and move functions, allowing you work with files as usual. TeraCopy is free for non-commercial use only. For commercial use you need to buy a license. The paid version of the program includes the following features: Copy/move to your favorite folders. Save reports as HTML and CSV files. Select files with the same extension/folder. Remove the selected files from the copy queue. Download: TeraCopy 4.0 | 14.6MB (Freeware, paid upgrade available) View: TeraCopy Website | Screenshot Get alerted to all of our Software updates on Twitter at @NeowinSoftware
  • Recent Achievements

    • Week One Done
      Eurosoft10 earned a badge
      Week One Done
    • One Month Later
      Eurosoft10 earned a badge
      One Month Later
    • One Year In
      Skeet Campbell earned a badge
      One Year In
    • One Month Later
      Sharbel earned a badge
      One Month Later
    • First Post
      BizSAR earned a badge
      First Post
  • Popular Contributors

    1. 1
      +primortal
      586
    2. 2
      +Edouard
      187
    3. 3
      Michael Scrip
      74
    4. 4
      PsYcHoKiLLa
      72
    5. 5
      neufuse
      69
  • Tell a friend

    Love Neowin? Tell a friend!