Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 寻找变量类型参数的中值_Java_Classcastexception - Fatal编程技术网

Java 寻找变量类型参数的中值

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

我有一个方法,它以对象的形式接受可变数量和类型的参数。我只想计算这些论点中数字的中位数。我使用列表插入元素(数字),然后使用集合对列表进行排序。每当我将整数和双精度作为参数传递时,Collections.sort()行中就会出现一个Classcast异常。以下是我的方法:

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
我可以通过以下任何方式调用该方法:

  • 系统输出打印项次(“中位数----------”+cmp.中位数(13,18,13,14,13,16,14,21,13))

  • System.out.println(“中位数---------”+cmp.Median(13,18.1,13,14,13,16,14,21,13))

  • 系统输出打印项次(“中位数----------”+cmp中位数(13,18,13,13,13,14,13,16,14,21,13)

  • 系统输出打印项次(“中位数---------”+cmp中位数(13,18,“xyz”,13,14,13,16,14,21,13))

  • 我认为Collections.sort()不能与double一起使用。请建议一种解决方法!

    转换

    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];
        }
    
    }