Roberto Luis Bisbé
Roberto Luis Bisbé

Reputation: 2090

Detect if an array contains integer or double

I'm working on a project that requires me to have a string representation of an array. The problem is having this duplicated code, that I'm sure can be refactored in some way, but I haven't found one yet.

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

Thanks in advance.

Upvotes: 7

Views: 1126

Answers (6)

beny23
beny23

Reputation: 35018

I would use commons-lang to create the string create the print method using an Object[] array as such

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, " ");
}

Note, this internally will copy an array which will box the ints into Integer objects, so if performance/size of array is an issue I would bite the bullet and create methods for the primitive types, though I'd call all the methods printArray and overload it with different types.

EDIT:

Instead of commons-lang, you could use Guava primitives, which will not copy the array (but will just autobox the floats in the list), so you could do:

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

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

Upvotes: 2

True Soft
True Soft

Reputation: 8796

Why not use one of the methods Arrays.toString(...) from java.util package?

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

Upvotes: 2

Thomas Jung
Thomas Jung

Reputation: 33092

Using guava you can convert the primitive array (int[]) to a List of the wrapper type (List) using Ints. Additionally you can use the Joiner.

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

The method is then:

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

Upvotes: 1

The solution to your issue is this:

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

    }

}

It produces this:

1 4 6 7 
33.44 55.66 11.22 

However, it only works if you define your arrays with boxed primitives (i.e., sub-classes of Number), but not with primitives (i.e., int[] and double[]).

The problem is that using boxed primitives is really inefficient.

Upvotes: 2

Alex
Alex

Reputation: 365

You can use the wrapper classes Integer and Double instead int and double. Write one Method using their base class Number

Upvotes: 0

AlexR
AlexR

Reputation: 115338

You can use java.lang.reflect.Array that allows access to elements of any time of array. See get(arr, index), getLength(arr) etc.

Upvotes: 4

Related Questions