Определить, содержит ли массив целое или двойное число - PullRequest
7 голосов
/ 25 августа 2011

Я работаю над проектом, который требует, чтобы у меня было строковое представление массива. Проблема в том, что этот дублированный код, я уверен, можно каким-то образом реорганизовать, но я еще не нашел.

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 ]

4 голосов
/ 25 августа 2011

Вы можете использовать java.lang.reflect.Array, что разрешает доступ к элементам любого времени массива. См get(arr, index), getLength(arr) и т. Д.

2 голосов
/ 25 августа 2011

Я бы использовал commons-lang для создания строки. Создайте метод печати, используя массив Object[] как таковой.

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

Обратите внимание, это внутренне скопирует массив, который будетвставьте целые числа в объекты Integer, поэтому, если проблема заключается в производительности / размере массива, я бы укусил пулю и создал методы для примитивных типов, хотя я бы вызвал все методы printArray и перегрузил бы их различными типами.

РЕДАКТИРОВАТЬ:

Вместо commons-lang вы можете использовать Guava примитивы, которые не будут копировать массив (но будут просто автоматически помещать поплавки в список), так что вымог сделать:

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

double[] doubleArray = ...;
String str = printArray(title, Floats.asList(doubleArray));
2 голосов
/ 25 августа 2011

Почему бы не использовать один из методов Arrays.toString(...) из пакета java.util?

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));
2 голосов
/ 25 августа 2011

Решение вашей проблемы:

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[]).

Проблема в том, что использование штучных примитивов действительно неэффективно.

1 голос
/ 25 августа 2011

Используя guava, вы можете преобразовать массив примитивов (int []) в список типа оболочки (List), используя Ints .Кроме того, вы можете использовать Столярный .

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);
}
0 голосов
/ 25 августа 2011

Вы можете использовать классы-обертки Integer и Double вместо int и double.Напишите один метод, используя его базовый класс Число

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...