Прочитайте текстовый файл и преобразуйте в массив 2d int в зависимости от ввода в Java

Я прочитал текстовый файл, который выглядит так:

operationName1 Value

Существует переменное количество строк с разными операциями и соответствующим значением. Я могу прочитать файл и получить массив 2D String в качестве вывода. Это мой код.

try{
    Path path = Paths.get("./myFile.txt");
    String[][] array = Files.lines(path)
                .map(s -> s.split("\\s+", 2))
                .map(a -> new String[]{a[0], a[1]})
                .toArray(String[][]::new);
    }catch(IOException e){  
}

Вопрос: Как я могу изменить свой код, чтобы вместо этого получить массив 2d int, где имя_операции1 будет равно «0», а имя_операции2 будет «1» (есть только две возможные операции, каждая из которых определяется определенной строкой)?

Этот текстовый файл:

operationOne 5
OtherOp 999
operationOne 8
operationOne 2

Станет этот массив 2d int:

[[0,5],[1,999],[0,8],[0,2]]

Индекс тоже важен. Итак, первая строка текстового файла — это первая строка моего массива.

PS: Если есть лучший синтаксис (более новый), я открыт для предложений.

Большое спасибо.


person David Gourde    schedule 29.03.2016    source источник
comment
Эй, Дэвид, почему бы не использовать ответ из предыдущего вопроса и не настроить его?   -  person Yassin Hajaj    schedule 29.03.2016
comment
У вас есть значение в a[0]. Проверьте, что это за значение, и сопоставьте его с соответствующим числом 0 или 1.   -  person Alexis C.    schedule 29.03.2016
comment
Почему вы пытаетесь использовать потоки здесь? Планируете ли вы использовать параллелизм? Если нет, то, вероятно, простой цикл был бы намного более читабельным (и, вероятно, немного быстрее).   -  person Pshemo    schedule 29.03.2016


Ответы (3)


Если вам нужен параллелизм? ... это может быть один подход

AtomicInteger atomicInteger = new AtomicInteger(0);
Map<String, Integer> known = new ConcurrentHashMap<>();
Path path = Paths.get("./myFile.txt");
int[][] array = Files.lines(path)
    .map(s -> s.split("\\s+", 2))
    .map(a -> new int[]{
        known.computeIfAbsent(a[0],
                k -> atomicInteger.getAndIncrement()),
        Integer.parseInt(a[1])
    })
    .toArray(int[][]::new);
person Meiko Rachimow    schedule 29.03.2016
comment
или см.: stackoverflow.com/ вопросы/29878981/ - person Meiko Rachimow; 30.03.2016
comment
Обратите внимание, что здесь нет причин использовать Integer[][] вместо int[][] - person Holger; 30.03.2016

Обычно я использую класс Scanner для чтения текстовых файлов.

ArrayList<String[]> array = new ArrayList();
Scanner scan= new Scanner(new File("./myFile.txt"));
String str;
String auxiliary= new String[2];
while(scan.hasNextLine()){
    str= scan.readLine();
    auxiliary=str.split(" "); // you can use also the \\s
    for(int i=0; i<array.size();i++){
        if(array.get(i)[0].equals(auxiliary[0])){
           String  aux2[]={i,auxiliary[1]};
           break;
        }
   }
   String  aux2[]={array.size,auxiliary[1]};
}

Я надеюсь, что это помогло.

# РЕДАКТИРОВАТЬ: Исправлены некоторые проблемы

person I'm just a poor boy    schedule 29.03.2016
comment
Несколько проблем: (1) Сканер не возвращает null, когда строк больше нет. Выдает исключение. Поэтому вместо while(str!=NULL) ((2) вы, вероятно, имели в виду null — Java чувствительна к регистру) вы должны использовать что-то вроде while(scan.hasNextLine()). (3) split ожидает в качестве аргумента строку " ", а не char ' '. (Улучшение) В большинстве случаев нет необходимости использовать split, когда у нас есть Сканер. Обычно мы используем здесь haveNext или haveNext*Type*, если знаем, сколько элементов появится в каждой строке (нам просто нужно использовать тогда hasNext() вместо hasNextLine). - person Pshemo; 29.03.2016
comment
Спасибо. Я за последние 3 месяца усердно работал на C, я кое-что поменял местами. Но я исправил. - person I'm just a poor boy; 30.03.2016

Это немного длинно, но позволяет перейти к операции Имя1...ОперацияИмяN.

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

public class Main {

    public static void main(String[] args) throws IOException {

            File file = new File("test.txt");
            BufferedReader bufferedReader = new BufferedReader(new FileReader(file));

            ArrayList<String> operations = new ArrayList<String>();
            ArrayList<Point> points = new ArrayList<Point>();

            String line;
            String[] array;

            int index;
            while((line = bufferedReader.readLine()) != null)
            {
                array = line.split(" ");

                if((index = hasOperation(array[0], operations)) == -1)
                {
                    operations.add(array[0]);
                    index = operations.size()-1;
                    points.add(new Point(index, Integer.parseInt(array[1])));
                }
                else
                {
                    points.add(new Point(index, Integer.parseInt(array[1])));
                }
            }

            System.out.print("[");
            for(int i = 0; i < points.size()-1; i++)
            {
                System.out.print(points.get(i).toString() + ",");
            }
            System.out.println(points.get(points.size()-1).toString()+"]");
    }



    public static int hasOperation(String operation, ArrayList<String> operations ){

        for(int index = 0; index < operations.size(); index++)
        {
            if(operation.equalsIgnoreCase(operations.get(index)))
                return index;
        }
        return -1;
    }

}

public class Point {
    public int x;
    public int y;


public Point(int x, int y){
        this.x = x;
        this.y = y;
    }

    @Override
    public String toString()
    {
        return "[" + x + "," + y + "]";
    }
}
person Jonathan.Hickey    schedule 29.03.2016