2016-03-29 5 views
2

las ich eine Textdatei, die wie folgt aussieht:liest Textdatei und konvertieren 2d int Array je nach Eingabe in Java

operationName1 Value 

Es gibt eine variable Anzahl von Zeilen, mit verschiedenen Operationen und entsprechendem Wert. Ich kann die Datei lesen und ein 2D-String-Array als Ausgabe erhalten. Das ist mein Code.

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

Frage: Wie kann ich den Code ändern, anstatt ein 2d int-Array zu erhalten, wo operationName1 wäre „0“ und operationName2 wäre „1“ (es gibt nur zwei mögliche Operation, die jeweils durch eine bestimmte Zeichenfolge)?

Diese Textdatei:

operationOne 5 
OtherOp 999 
operationOne 8 
operationOne 2 

dass 2d int Array werden würde:

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

Der Index ist auch wichtig. Die erste Zeile der Textdatei ist also die erste Zeile meines Arrays.

PS: Wenn es eine bessere Syntax (eine neuere) gibt, bin ich offen für Vorschläge.

Vielen Dank.

+0

Hey David, warum nicht verwenden, um die Antwort aus der vorherige Frage sein, und es anpassen? –

+0

Sie haben den Wert in 'a [0]'. Testen Sie, was dieser Wert ist und ordnen Sie ihn der entsprechenden Nummer entweder 0 oder 1 zu. –

+0

Warum versuchen Sie Streams hier zu verwenden? Planen Sie Parallelität? Wenn nicht, dann wäre wahrscheinlich eine einfache Schleife viel besser lesbar (und wahrscheinlich auch etwas schneller). – Pshemo

Antwort

4

Wenn Sie brauchen parallelism? ... dies könnte ein Ansatz

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

oder siehe: http://stackoverflow.com/questions/29878981/java-8-equivalent-to-getlinenumber-for-streams –

+1

Beachten Sie, dass es keinen Grund gibt, 'Integer [] []' anstelle von 'int [zu verwenden] ] [] 'hier ... – Holger

+0

@Holger Ich stimme zu, der Code ist aktualisiert –

1

Ich benutze normalerweise die Scanner-Klasse für Lesetextdateien

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

Ich hoffe, es half.

EDIT #: einige Probleme behoben,

+0

Wenige Probleme: (1) Der Scanner gibt 'null' nicht zurück, wenn keine Zeilen mehr vorhanden sind. Es löst Ausnahme aus. Statt "while (str! = NULL)" ((2) hast du wahrscheinlich "null" gemeint - Java unterscheidet zwischen Groß- und Kleinschreibung) solltest du etwas wie 'while (scan.hasNextLine())' verwenden. (3) 'Split' erwartet String' '' 'not char' '' 'als Argument. (Verbesserung) In den meisten Fällen ist es nicht nötig, "Split" zu verwenden, wenn wir einen Scanner haben. Normalerweise verwenden wir 'haveNext' oder' haveNext * Type * 'hier, wenn wir wissen, wie viele Elemente in jeder Zeile vorkommen (wir brauchen nur' hasNext() 'anstelle von' hasNextLine'). – Pshemo

+0

Danke. Ich habe in den letzten 3 Monaten hart in C gearbeitet, ich habe einiges getauscht. Aber ich habe es behoben. –

1

Es ist ein bisschen lang, aber es ermöglicht Ihnen operationName1 ... operationNameN

ich immer gehen versuchen, den Code sauber zu halten, so dass, wenn Sie Fragen haben, fragen Sie einfach

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 + "]"; 
    } 
}