• 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
  _kane81 said:
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
  _kane81 said:
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.

  Quote
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 deepu.bhanu@gmail.com

thank you

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

    • No registered users viewing this page.
  • Posts

    • Sounds like a good time to do a fresh install of Windows. WTF people...
    • It only includes Russia. All other territories come at an additional cost of $20/pm/per territory you want to use it in.
    • From cars to cosmos: Honda's experimental rocket aces first landing test by Paul Hill Image via Honda Watch your back SpaceX, the Japanese company Honda has just performed a successful first launch of its experimental reusable rocket. The 6.3 meter rocket, which weighs 900kg, reached a modest altitude of 271.4 meters, but managed to land within 37cm of its target (1.2 feet), which is certainly pretty close. The rocket took off from a Honda facility in Taiki Town, Hokkaido, a growing space town in Japan. The flight time was also modest, coming in at just 56.6 seconds, but in that time, Honda was able to demonstrate key reusability technologies such as flight stability and landing capability. This marks a significant milestone for Honda’s space R&D department, which began work just four years ago. If you remember the tests SpaceX was performing around 2012 with Grasshopper, well Honda is at about the same stage with its reusable rocket. Why Honda is building rockets: Beyond cars and motorcycles Honda said that it wants to leverage core technologies it already works on for offering space services. It said that reusable rockets are a key part of sustainable space transportation. By 2029, the company wants to be able to perform suborbital launches, and while commercialization hasn’t been decided yet, it sees itself launching remote-sensing and wide-area communication satellites in the future. The Japanese car maker sees growing demand for satellite launches and wants to be involved by developing reusable rockets which could help it perform such launches economically. If it does end up finding customers, it will add more competition to the rocket launch sector. While the company hasn’t confirmed this, by developing its own launch system, it could eventually be in a position to launch its own satellites that could provide services to its cars to add value for customers. The competitive landscape and Japan's space ambitions Honda is just the latest company to join the growing list of companies trying to develop reusable rocket technology. The most famous companies doing this are SpaceX and Blue Origin, but there are also lots of other companies around the world also developing this technology. Honda is still taking baby steps compared to SpaceX, but it shows that the company is taking a focused, step-by-step approach, and achieving successes as noted by this launch. Hopefully, the company ends up providing tough competition against SpaceX, Blue Origin, and other companies so that it can help to drive down prices and spur on innovation.
    • Does that subscription include international data roaming, inclusive of Russia?
    • If you're stupid enough to try and get one, each and every headache along the way is on you. I can only hope that these roadblocks on a pre-order are enough to dissuade people.
  • Recent Achievements

    • Reacting Well
      pnajbar earned a badge
      Reacting Well
    • Week One Done
      TBithoney earned a badge
      Week One Done
    • First Post
      xuxlix earned a badge
      First Post
    • First Post
      Tomek Święcicki earned a badge
      First Post
    • One Year In
      carlitin86 earned a badge
      One Year In
  • Popular Contributors

    1. 1
      +primortal
      683
    2. 2
      ATLien_0
      290
    3. 3
      Michael Scrip
      228
    4. 4
      +FloatingFatMan
      194
    5. 5
      Steven P.
      145
  • Tell a friend

    Love Neowin? Tell a friend!