• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 312
  • Last Modified:

How do i sort 2 arraylist elements such as these?

1st element : Hello World F 9
2nd element : Holla World M 8
3rd element: Holla holla G 7

I want to sort them based on the numerical values as well as on the 3rd char in the list. can anyone provide me with a working code for this?
0
ravivanjani
Asked:
ravivanjani
  • 7
  • 7
4 Solutions
 
CEHJCommented:
Try a Comparator with the following:
public int compare(Object o1, Object o2) {
	String[] a1 = ((String)o1).split(" +");
	String[] a2 = ((String)o2).split(" +");
	int result = a1[2].compareTo(a2[2]);
	if (result == 0) {
		result = Integer.parseInt(a1[3]) - Integer.parseInt(a2[3]);
	}
	return result;
}

Open in new window

0
 
ravivanjaniAuthor Commented:
Ok the problem is..i dont understand what do i pass in object 1 and object 2 and i do not understand where the string array comesfrom. This is my code. and the actual contents of the file are as such.

Kournikova Anna F F 6-3-1975 Red
Hingis Martina M F 4-2-1979 Green
Seles Monica H F 12-2-1973 Black
package test;
 
import java.util.*;
import java.io.*;
 
public class Testcompare
{
	public List li = new ArrayList();
	public StringBuffer s = new StringBuffer();
	public String b;	
	public void readfiles()
	{
		try
		{	
			BufferedReader br = new BufferedReader(new FileReader("space.txt"));
			BufferedReader br1 = new BufferedReader(new FileReader("comma.txt"));
			BufferedReader br2 = new BufferedReader(new FileReader("pipe.txt"));
			String str = "";
			
			while((str = br.readLine()) != null)
			{
				li.add(str);
			}
			while((str = br1.readLine()) != null)
			{
				b = str.replaceAll(",", "");		
				li.add(b);
			}
			while((str = br2.readLine()) != null)
			{
				b = str.replaceAll("\\|", "");		
				li.add(b);
			}
			
		}
		catch(Exception e)	
		{
			e.printStackTrace();
		}
	}
	public static void main(String[] args)
	{
		Testcompare r = new Testcompare();
		r.readfiles();	
		for(int i = 0; i < r.li.size(); i ++)
		{
			System.out.println(r.li.get(i));
		}
	}
}

Open in new window

0
 
CEHJCommented:
You would do


Collections.sort(li, new Comparator() {
	public int compare(Object o1, Object o2) {
		String[] a1 = ((String)o1).split(" +");
		String[] a2 = ((String)o2).split(" +");
		int result = a1[2].compareTo(a2[2]);
		if (result == 0) {
			result = Integer.parseInt(a1[3]) - Integer.parseInt(a2[3]);
		}
		return result;
	}
});

Open in new window

0
Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

 
ravivanjaniAuthor Commented:
what does a1[2] and a2[2] contain though??
0
 
CEHJCommented:
The '3rd char in the list'
0
 
ravivanjaniAuthor Commented:
I did add the code you said to the program but it is giving me exceptions.
0
 
CEHJCommented:
>>
Kournikova Anna F F 6-3-1975 Red
Hingis Martina M F 4-2-1979 Green
Seles Monica H F 12-2-1973 Black
>>

The above is completely different input to that you posted originally
0
 
ravivanjaniAuthor Commented:
Ohh yes i apologize...My final input is going to be

Kournikova Anna F F 6-3-1975 Red
Hingis Martina M F 4-2-1979 Green
Seles Monica H F 12-2-1973 Black
Abercrombie Neil Male Tan 2/13/1943
Bishop Timothy Male Yellow 4/23/1967
Kelly Sue Female Pink 7/12/1959
Smith  Steve  D  M  Red  3-3-1985
Bonk  Radek  S  M  Green  6-3-1975
Bouillon  Francis  G  M  Blue  6-3-1975

I want to sort this based on 3 different criteria
gender
date
last name
0
 
CEHJCommented:
The data are not arranged properly. e.g.

>>Hingis Martina M F 4-2-1979 Green
>>Abercrombie Neil Male Tan 2/13/1943

have dates and colours in opposite ordering

>>Kelly Sue Female Pink 7/12/1959
>>Hingis Martina M F 4-2-1979 Green

have different gender ordering
0
 
ravivanjaniAuthor Commented:
That is the way it is. Is there a solution to this?
0
 
CEHJCommented:
The best way is to ensure that the data are ordered uniformly
0
 
ravivanjaniAuthor Commented:
ok i have ordered the data...now the data looks like this

Hingis Martina Female 4/2/1979 Green
Kelly Sue Female 7/12/1959 Pink
Kournikova Anna Female 6/3/1975 Red
Seles Monica Female 12/2/1973 Black
Abercrombie Neil Male 2/13/1943 Tan
Bishop Timothy Male 4/23/1967 Yellow
Bonk Radek Male 6/3/1975 Green
Bouillon Francis Male 6/3/1975 Blue
Smith Steve Male 3/3/1985 Red

How do i sort this data now based on the date? I am unable to do that.
0
 
CEHJCommented:
OK. Try this
Collections.sort(li, new Comparator() {
	DateFormat df = new SimpleDateFormat("d-M-yyyy");
	public int compare(Object o1, Object o2) {
		Date d1 = null;
		Date d2 = null;
		String[] a1 = ((String)o1).split(" +");
		String[] a2 = ((String)o2).split(" +");
		int result = a1[2].compareTo(a2[2]);
		if (result == 0) {
			try {
				result = df.parse(a1[3]).compareTo(df.parse(a2[3]));
			}
			catch(ParseException e) {
				e.printStackTrace();
			}
			if (result == 0) {
				result = a1[0].compareTo(a2[0]);
			}
		}
		return result;
	}
});

Open in new window

0
 
ravivanjaniAuthor Commented:
Thank you. It works fine. I am just trying to figure out a few more things.
Thank you again
0

Featured Post

VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

  • 7
  • 7
Tackle projects and never again get stuck behind a technical roadblock.
Join Now