0

オブジェクトの形式で変数の数と型の引数を取るメソッドがあります。これらの引数の数値のみの中央値を計算したい。Lists を使用して要素 (数値) を挿入し、次に Collections を使用してリストを並べ替えました。引数として double と共に整数を渡すと、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;
       }

    }

次のような方法でメソッドを呼び出すことができます。

  1. System.out.println("中央値---------"+cmp.median(13, 18, 13, 14, 13, 16, 14, 21, 13));

  2. System.out.println("中央値---------"+cmp.median(13, 18.1, 13, 14, 13, 16, 14, 21, 13));

  3. System.out.println("中央値---------"+cmp.median(13, 18, 13,"13", 14, 13, 16, 14, 21,13);

  4. System.out.println("中央値---------"+cmp.median(13, 18,"xyz", 13, 14, 13, 16, 14,21,13));

Collections.sort() は Doubles では機能しないと思います。抜け道を提案してください!

4

4 に答える 4

1

変換

List l = new ArrayList<Object>();

List<Number> l = new ArrayList<Number>();

そして使用:forループ内で、次のものを持っています:

if(O[i] instanceof Number)
   l.add((Number)O[i]);

そしてそれらをソートするには:

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

defined が type のリストであるため、正しくスローClassCastExceptionされます。宣言ごとに実装されていません。したがって、仕事をするコンパレータを提供する必要がありますlObjectObjectComparable

于 2013-04-15T11:46:43.900 に答える
0

問題はelseブロックにあると思います。

制御フローが else になる場合は、オブジェクトが数値 (double またはその他の方法) ではないことを意味するため、リストに追加することは賢明ではありません。

また、If ブロックでは、さまざまな種類の数値 (Integer、Double など) を区別し、それに応じてキャストを行う必要があります。

于 2013-04-15T11:54:15.293 に答える
0

私は次のようなことをします:

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

そして、残りのアルゴリズムに影響を与えることなく、識別/解析のニーズに合わせてisNumber/メソッドを変更できます。getNumber

于 2013-04-15T11:55:00.180 に答える
0

任意の数と型の引数の中央値を見つける方法

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

}
于 2013-04-16T08:31:50.587 に答える