Чтение CSV-файла в виде матрицы (массива массивов) в Java при анализе правильного типа - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь написать общую функцию для генерации Object [] [] из матрицы, записанной в CSV-файле.

Я хотел бы знать, является ли то, что я написал, фиктивным в некотором смысле, так как я получить некоторые предупреждения о сотворении.

Вот мой путь:

  1. Прочитайте CSV

    String delimiter="\t";
    List<String> data=Files.readAllLines("matrix.csv");
    
  2. Функции для произнесения Строка, массив и двойной массив:

    public static <T> Function<String, T> simpleCast(Class<T> type) {
       Function<String, T> casting;
    
       switch (type.getCanonicalName()) {
        case "double":
        case "java.lang.Double":
            casting = s -> (T) Double.valueOf(s);
            break;
        case "int":
        case "java.lang.Integer":
            casting = s -> (T) Integer.valueOf(s);
            break;
        case "boolean":
        case "java.lang.Boolean":
            casting = s -> (T) Boolean.valueOf(s);
            break;
        case "float":
        case "java.lang.Float":
            casting = s -> (T) Float.valueOf(s);
            break;
        case "long":
        case "java.lang.Long":
            casting = s -> (T) Long.valueOf(s);
            break;
        default:
            casting = type::cast;
            break;
    }
    
    return casting;
    }
    
    
    public static <T> IntFunction<T[]> simpleArrayCast(Class<T> type) {
       return i -> {
        switch (type.getCanonicalName()) {
            case "double":
                return (T[]) new Double[i];
            case "int":
                return (T[]) new Integer[i];
            case "boolean":
                return (T[]) new Boolean[i];
            case "float":
                return (T[]) new Float[i];
            case "long":
                return (T[]) new Long[i];
            default:
                return (T[]) Array.newInstance(type, i);
        }
    };
    }
    
    
    public static <T> IntFunction<T[][]> doubleArrayCast(Class<T> type) {
        Class<?> arrayType = Util.simpleArrayCast(type).apply(0).getClass();
    
        return i -> (T[][]) Array.newInstance(arrayType, i);
    }
    
  3. Метод создания матрицы

    public <T> T[][] toMatrix(List<String> data, Class<T> type) {
        return data.stream()
            .map(row -> Arrays.stream(row.split(delimiter, -1))
                    .map(s -> Util.simpleCast(type).apply(s))
                    .toArray(Util.simpleArrayCast(type))
            ).toArray(Util.doubleArrayCast(type));
    }
    
  4. Затем я могу сгенерировать матрица, как это.

    MyClass[][] matrix=toMatrix(data, MyClass.class);
    

Единственное ограничение, которое я нахожу, заключается в том, что если я использую toMatrix (data, double.class), то я получаю Double [] [], который может быть несовместимо с некоторыми Apache математическими функциями.

Кроме того, мне интересно, действительно ли полезно использовать прямое приведение по умолчанию, поскольку оно будет работать в основном только для String и возвращать исключение ClassCastException для большинства из остальных?

Что вы думаете? Это безопасно? (конечно, если нет сведений о типе в файле).

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