Прочетете текстов файл и преобразувайте в 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 масив, където operationName1 ще бъде "0", а operationName2 ще бъде "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

Малко е дълъг, но ви позволява да отидете на operationName1...operationNameN

Винаги се опитвам да поддържам кода чист, така че ако имате въпроси, просто питайте

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