Java 寻找变量类型参数的中值
我有一个方法,它以对象的形式接受可变数量和类型的参数。我只想计算这些论点中数字的中位数。我使用列表插入元素(数字),然后使用集合对列表进行排序。每当我将整数和双精度作为参数传递时,Collections.sort()行中就会出现一个Classcast异常。以下是我的方法:Java 寻找变量类型参数的中值,java,classcastexception,Java,Classcastexception,我有一个方法,它以对象的形式接受可变数量和类型的参数。我只想计算这些论点中数字的中位数。我使用列表插入元素(数字),然后使用集合对列表进行排序。每当我将整数和双精度作为参数传递时,Collections.sort()行中就会出现一个Classcast异常。以下是我的方法: public Object median(Object... O) { List l = new ArrayList<Object>(); for (int i = 0; i < O.len
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;
}
}
public Object median(Object…O){
列表l=新的ArrayList();
for(int i=0;i
我可以通过以下任何方式调用该方法:
List l = new ArrayList<Object>();
并对其进行分类:
Collections.sort(l, new Comparator<Number>(){
@Override
public void compare(Number t1, Number t2){
if(t1.doubleValue<t2.doubleValue)
return -1;
else if(t1.doubleValue==t2.doubleValue)
return 0
else return 1
}
}
Collections.sort(l,新的Comparator(){
@凌驾
公共无效比较(编号t1、编号t2){
if(t1.doubleValue我想问题在于else块
如果您的控制流转到else,则表示该对象不是一个数字(双精度或其他方式),因此将其添加到列表中是不谨慎的
此外,在If块中,您可能应该区分各种类型的数字,例如整数、双精度等,并相应地进行转换。我会这样做:
public Object median(Object... objs) {
List<Number> nrs = extractNumbers(objs);
// do whatever with the numbers
}
private List<Number> extractNumbers(Object[] objs) {
final List<Number> nrs = new ArrayList<Number>();
for(final Object o:objs){
if(isNumber(o)){
nrs.add(getNumber(o));
}
}
return nrs;
}
private boolean isNumber(Object o){
Number.class.isAssignableFrom(o.getClass());
}
private Number getNumber(Object o){
return (Number) o;
}
public Object median(Object…objs){
列表nrs=提取编号(objs);
//用数字做任何事
}
私有列表编号(对象[]objs){
最终列表nrs=新的ArrayList();
for(最终对象o:objs){
if(isNumber(o)){
nrs.add(获取编号(o));
}
}
返回nrs;
}
私有布尔isNumber(对象o){
Number.class.isAssignableFrom(o.getClass());
}
私有编号getNumber(对象o){
返回(编号)o;
}
然后,您可以修改isNumber
/getNumber
方法以满足您的识别/解析需要,而不影响算法的其余部分方法以查找任意数量和类型的参数的中值
@覆盖
公共对象中间带(对象…O){
列表l=新的ArrayList();
for(int i=0;i
为什么不将所有内容都作为Double传递?我可以传递所有Double,但普通用户不会传递!:)可以做的一件事是创建一个类,它的一个属性将是Double值(将任何不是Double的内容转换为Double),使用Double.compare()覆盖该类的compareTo()什么对象?一些自定义类对象?因为在您的解决方案列表中,对象是数字类型,所以列表l无法添加对象。您需要检查Obejct的类型,我已对其进行了编辑。只有当它是数字时,才能将其添加到列表中。如果不将对象转换为数字,则不能直接将对象添加到列表中…当然不能。如果它们严格属于类型P对象,则不存在任何解决方案
Collections.sort(l, new Comparator<Number>(){
@Override
public void compare(Number t1, Number t2){
if(t1.doubleValue<t2.doubleValue)
return -1;
else if(t1.doubleValue==t2.doubleValue)
return 0
else return 1
}
}
public Object median(Object... objs) {
List<Number> nrs = extractNumbers(objs);
// do whatever with the numbers
}
private List<Number> extractNumbers(Object[] objs) {
final List<Number> nrs = new ArrayList<Number>();
for(final Object o:objs){
if(isNumber(o)){
nrs.add(getNumber(o));
}
}
return nrs;
}
private boolean isNumber(Object o){
Number.class.isAssignableFrom(o.getClass());
}
private Number getNumber(Object o){
return (Number) o;
}
@Override
public Object median(Object... O) {
List<Double> l = new ArrayList<Double>();
for (int i = 0; i < O.length; i++) {
if (Number.class.isAssignableFrom(O[i].getClass())) {
if (O[i] instanceof Double) {
Double d = (Double) O[i];
l.add(d);
} else if (O[i] instanceof Integer) {
Integer j = (Integer) O[i];
double d = Double.parseDouble(Integer.toString(j));
l.add(d);
}
} else {
try {
double d = Double.parseDouble(O[i].toString());
l.add(d);
} catch (Exception e) {
}
}
}
Double[] array = new Double[(l.size())];
l.toArray(array);
Arrays.sort(array);
double sum = 0;
if (array.length % 2 == 0) {
sum = array[array.length / 2 - 1] + array[array.length / 2];
return sum / 2;
} else {
return array[array.length / 2];
}
}