检测数组是包含整数还是双精度

时间:2011-08-25 06:57:45

标签: java numbers

我正在开发一个项目,要求我有一个数组的字符串表示。问题是这个重复的代码,我确信可以用某种方式重构,但我还没有找到。

private static String printDoubleArray(String title, double[] array){
    String result = title;
    for (double d : array) {
        result += d + " ";
    }
    return result;
}

private static String printIntArray(String title, int[] array){
    String result = title;
    for (int d : array) {
        result += d + " ";
    }
    return result;
}

提前致谢。

6 个答案:

答案 0 :(得分:4)

您可以使用允许访问阵列任何时间元素的java.lang.reflect.Array。请参阅get(arr, index)getLength(arr)等。

答案 1 :(得分:2)

您的问题的解决方案是:

public class Test {

    public static String numberArrayToString(Number[] arr) {

        if ( arr == null ) return "";

        StringBuilder sb = new StringBuilder();

        for ( Number n : arr) {
            sb.append(n.toString()).append(" ");
        }

        return sb.toString();

    }

    public static void main(String[] args) {

        Integer[] intArr = { 1, 4, 6, 7 };
        Double[] dblArr = { 33.44, 55.66, 11.22 };

        System.out.println(numberArrayToString(intArr));
        System.out.println(numberArrayToString(dblArr));

    }

}

它产生了这个:

1 4 6 7 
33.44 55.66 11.22 

但是,它只适用于使用盒装基元(即Number的子类)定义数组,但不能使用基元(即int[]double[])定义数组。

问题在于使用盒装基元效率非常低。

答案 2 :(得分:2)

为什么不使用java.util package中的Arrays.toString(...)方法之一?

int[] intArray = {1, 2, 4};
double[] doubleArray = {1.1, 2.2, 4.4};
System.out.println(Arrays.toString(intArray));
System.out.println(Arrays.toString(doubleArray));

答案 3 :(得分:2)

我会使用commons-lang创建字符串,使用Object[]数组创建print方法

int[] intArray = ...;
String str = printArray(title, ArrayUtils.toObject(intArray));

double[] doubleArray = ...;
String str = printArray(title, ArrayUtils.toObject(doubleArray));

public static void printArray(String title, Object[] array) {
    return title + " " + StringUtils.join(array, " ");
}

注意,这内部将复制一个数组,该数组将int整理成Integer对象,所以如果数组的性能/大小是一个问题,我会咬住子弹并为原始类型创建方法,尽管我会调用所有的方法printArray并用不同的类型重载它。

编辑:

而不是commons-lang,你可以使用Guava基元,它不会复制数组(但只会自动放映列表中的浮点数),所以你可以这样做:

int[] intArray = ...;
String str = printArray(title, Ints.asList(intArray));

double[] doubleArray = ...;
String str = printArray(title, Floats.asList(doubleArray));

答案 4 :(得分:1)

使用guava,您可以使用Ints将原始数组(int [])转换为包装类型(List)的List。此外,您可以使用Joiner

Joiner.on(' ').join(Ints.asList(new int[]{1,2,3}));

方法是:

void printIntArray(String title, int[] array) {
    printArray(title, Ints.asList(array));
}

String printArray(String title, Iterable<? extends Number> asList){
    return title + " " + Joiner.on(' ').join(asList);
}

答案 5 :(得分:0)

您可以使用包装类Integer和Double代替int和double。使用基类Number

编写一个方法