2016-03-29 25 views
2

yılında girdi bağlı olarak 2d int diziye dönüştürmek Şöyle bir metin dosyası okudum. Dosyayı okuyabilir ve çıktı olarak bir 2D String dizisi alabilirim. Bu benim kodum.Oku metin dosyası ve Java

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

Soru: Belirli bir tanımladığı sadece iki olası operasyon, her yoktur (onun yerine bir 2d int dizisini almak için kodumu nasıl değiştirebildiği, operationName1 "0" nerede olacağını ve operationName2 "1" olacaktır dize)?

Bu yazı dosyası:

operationOne 5 
OtherOp 999 
operationOne 8 
operationOne 2 

o 2d int dizi haline misiniz:

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

dizini çok önemlidir. Yani metin dosyasının 1. satırı, dizilimin 1. satırı.

Not: Daha iyi bir sözdizimi varsa (daha yeni bir tane), öneriye açığım.

Çok teşekkür ederim.

+0

Hey David, neden önceki soruya cevap kullanmak ve özelleştirmek bir yaklaşım olabilir? –

+0

Değer, a [0] 'dır. Bu değerin ne olduğunu test edin ve 0 veya 1'e karşılık gelen numarayla eşleştirin. –

+0

Neden burada akışları kullanmaya çalışıyorsunuz? Paralellik kullanmayı planlıyor musunuz? Eğer değilse, muhtemelen basit döngü çok daha fazla okunabilir (ve muhtemelen biraz daha hızlı). – Pshemo

cevap

4

parallelism'a ihtiyacınız varsa? ... Bu

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

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

+1

'Int [yerine [] []' kullanmak için bir neden olmadığını unutmayın. ] [] 'burada… – Holger

+0

@Holger Katılıyorum, kod güncellendi –

1

Normalde okuma metin dosyaları

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

Ben yardımcı umut için Tarayıcı sınıfını kullanın.

# DÜZENLEME: Bu biraz uzun bazı sorunlar

+0

Birkaç sorun: (1) Daha fazla satır olmadığında tarayıcı 'null' döndürmez. Bu istisna atar. Yani (str! = NULL) 'yerine ((2) muhtemelen 'null' anlamına gelir - Java büyük-küçük harf duyarlıdır) '(scan.hasNextLine())' gibi bir şey kullanmalısınız. (3) 'split' argüman olarak' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' (İyileştirme) Çoğu durumda, tarayıcı kullandığımızda 'split' kullanmaya gerek yoktur. Genellikle "haveNext" veya "haveNext * Type *" işlevini kullanırız. Burada her satırda kaç tane elemanın görüneceğini biliyoruz (sadece "hasNextLine" yerine "hasNext()' yi kullanmamız gerekiyor). – Pshemo

+0

Teşekkürler. Son 3 ayda C'de çok çalıştım, bazı şeyleri değiştirdim. Ama ben düzeltdim. –

1

düzeltildi, ama artık gitme verir operationName1 ... operationNameN

Hep Sorularınız varsa eğer öyleyse, temiz kod tutmaya çalışın sadece

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