I have a method which takes variable number and types of arguments in the form of Object. I want to calculate the median of only the numbers in those arguments. I used Lists to insert the elements(numbers) and then Collections to sort the List. I am getting a Classcast exception in Collections.sort() line whenever I am passing integers along with doubles as arguments. Here is my method:
public Object median(Object... O) {
List l = new ArrayList<Object>();
for (int i = 0; i < O.length; i++) {
if (Number.class.isAssignableFrom(O[i].getClass())) {
l.add(O[i]);
} else {
try {
double d = Double.parseDouble(O[i].toString());
l.add(d);
} catch (Exception e) {
}
}
}
Collections.sort(l);
double sum = 0;
if (l.size() % 2 == 0) {
if (l.get((l.size()) / 2 - 1) instanceof Double) {
Double d = (Double) l.get((l.size()) / 2 - 1);
sum += d;
} else if (l.get((l.size()) / 2 - 1) instanceof Integer) {
Integer d = (Integer) l.get((l.size()) / 2 - 1);
sum += d;
}
if (l.get((l.size()) / 2) instanceof Double) {
Double d1 = (Double) l.get(l.size() / 2);
sum += d1;
} else if (l.get((l.size()) / 2) instanceof Integer) {
Integer d1 = (Integer) l.get(l.size() / 2);
sum += d1;
}
return sum / 2;
} else {
if (l.get((l.size()) / 2) instanceof Double) {
Double d1 = (Double) l.get(l.size() / 2);
sum = d1;
} else if (l.get((l.size()) / 2) instanceof Integer) {
Integer d1 = (Integer) l.get(l.size() / 2);
sum = d1;
}
return sum;
}
}
I can call the method in any way like :
System.out.println("Median---------"+cmp.median(13, 18, 13, 14, 13, 16, 14, 21, 13));
System.out.println("Median---------"+cmp.median(13, 18.1, 13, 14, 13, 16, 14, 21, 13));
System.out.println("Median---------"+cmp.median(13, 18, 13,"13", 14, 13, 16, 14, 21,13);
System.out.println("Median---------"+cmp.median(13, 18,"xyz", 13, 14, 13, 16, 14,21,13));
I think Collections.sort() cant work with Doubles. Please suggest a way out!