2013-10-24 28 views
9

Java hakkında daha fazla bilgi edinmemde bana yardımcı olacak bir kendi kendine öğrenme alıştırması yapıyorum ancak bu soruya takıldım.Sekmeyle ayrılmış bir dosyayı okuyun ve kelimeleri ArrayList'e yerleştirin

Name Hobby 
Susy eat fish 
Anna gardening 
Billy bowling with friends 

Not: isim ve hobi tüm satır okumak ve arraylist (isim, hobi) koymak için en iyi yolu nedir sekmesi

ile ayrılır Aşağıdaki txt dosyası var. Zor kısmı

eat fish or bowling with friends 

, boşluk vardır ve bu, bir dizi altına alınması gerektiğini ve tabii ki hardcode edemezler.

public void openFile(){ 
      try{ 
       FileInputStream fstream = new FileInputStream("textfile.txt"); 
      // use DataInputStream to read binary NOT text 
      BufferedReader br = new BufferedReader(new InputStreamReader(fstream)); 
      ArrayList<String> names = new ArrayList<String>(); 
      ArrayList<String> hobbies = new ArrayList<String>(); 
      String lineJustFetched; 
      while ((lineJustFetched = br.readLine()) != null) { 
      String[] tokens = lineJustFetched.split(" \t"); 

bir hata var:

java.lang.StringIndexOutOfBoundsException: String index out of range: -1

Ben endeksi sayma zanlısı bir sekmede çok kullanışlı değildir İşte benim şimdiki kodudur. Herhangi bir fikrin var mı?

+0

yeni/boş satır dosyanın sonuna mevcut olduğundan emin olun. – srkavin

cevap

7

Pekala, tarifi aşağıda gösterilen yapmanız gerekir:

  1. bir BufferedReader
  2. lineJustFetched adında bir String değişkene bir ArrayList<String>
  3. Başlangıç ​​okuma verileri oluşturun. üretilen String[] üzerinde lineJustFetched.split("\t");
  4. Yineleyin arayarak
  5. Bölünmüş String. Eğer ArrayList içine girmek istediğiniz belirteci ""
  6. Değilse değilse bu kadar beyaz boşluk olmayacak \t değerlere dayalı bölmek gerektiğini belirtmek ArrayList

kelime eklemek, kontrol sorun.

SSCCE

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.util.ArrayList; 

public class WordsInArray { 
    public static void main(String[] args) { 
     try{ 
      BufferedReader buf = new BufferedReader(new FileReader("/home/little/Downloads/test")); 
      ArrayList<String> words = new ArrayList<>(); 
      String lineJustFetched = null; 
      String[] wordsArray; 

      while(true){ 
       lineJustFetched = buf.readLine(); 
       if(lineJustFetched == null){ 
        break; 
       }else{ 
        wordsArray = lineJustFetched.split("\t"); 
        for(String each : wordsArray){ 
         if(!"".equals(each)){ 
          words.add(each); 
         } 
        } 
       } 
      } 

      for(String each : words){ 
       System.out.println(each); 
      } 

      buf.close(); 

     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
}  

Çıktı

John 
likes to play tennis 
Sherlock 
likes to solve crime 
+0

Merhaba, kaynak kodumu yönettiğiniz şekilde düzenleyin .. doğru mu? – user2891092

+0

@ user2891092 Sizin için bir SSCCE yayınladım. –

+0

ama her şeyi bir arraylist içine koydu. onları iki arraylist olarak ayırmak mümkün mü (ör. john isimlere konur ve tenis oynamayı sever hobi haline getirir)? – user2891092

0

Sen commons-lang kitaplığı denemelisiniz. , y [0] " y [1] yer aldığı "Billy"

String x="Billy bowling with friends";

String y[]=StringUtils.split(x, '\t');

Billy ve bowling arasında sekme olarak bulunmadığı varsayımıyla: http://commons.apache.org/proper/commons-lang/javadocs/api-3.1/index.html diğer birçok yararlı şeyler arasında bir ayırıcı kullanılarak bir dize bölebilirsiniz arkadaşlarla bowling "

0

Sekmeyi ayrıştırdığınızda, ileride başvurmak için sekme için" \ t "gibi bir sınırlayıcı vardır. Bunun yerine kullanın.split ("")

Ayrıca, hata oluştuğunda, karakter bulunamadığı anlamına gelir, bu nedenle -1, dolayısıyla bir Array ... -1 içinde depolamaya çalıştığınızda geçerli değildir.

Sen programı F10 atmak adıma ya da birlikte Adı ve Hobi sütun ayrılmış ise

Sadece bazı ipuçları

2

IDE'nizde bağlı diğer bazı anahtar F11..or (yani bir çek atmak) sekme \t, böyle bir şey yapması gerektiğini (ve sonunda taramayı kapatmak için unutmayın): diğerleri için

public void readFile() throws FileNotFoundException{ 
    Scanner scan = new Scanner(new File("D://a.txt")); 
    ArrayList<String> names = new ArrayList<String>(); 
    ArrayList<String> hobbies = new ArrayList<String>(); 

    while(scan.hasNext()){ 
     String curLine = scan.nextLine(); 
     String[] splitted = curLine.split("\t"); 
     String name = splitted[0].trim(); 
     String hobby = splitted[1].trim(); 
     if(!"Name".equals(name)){ 
      names.add(name); 
     } 
     if(!"Hobby".equals(hobby)){ 
      hobbies.add(hobby); 
     } 
    } 
    System.out.println(names); 
    System.out.println(hobbies); 
    scan.close(); 
} 
1

hala bu tökezletici. Bu listeden, her elemanın harita

  • harita yöntemi birinci başlık elemanının filtre

    • filtre yöntemi gösterir

      olarak Stream API (Java 8) kullanılarak

      , bu yapılabilir Yeni akış için başka bir öğeye akış.

    package com.bhavya.stackoverflow.examples.q19575308; 
    
    import java.io.BufferedReader; 
    import java.io.InputStream; 
    import java.io.InputStreamReader; 
    import java.util.Arrays; 
    import java.util.HashMap; 
    import java.util.function.Predicate; 
    
    /** 
    * Java 8 Stream API to handle file reading. 
    * 
    * @author bhavya.work 
    */ 
    public class StreamTests { 
        public static void main(String[] args) { 
        try { 
         InputStream fileInputStream; 
         BufferedReader bufferedReader; 
         final String filepathInSamePackage = "textfile.txt"; 
         //filter predicate 
         Predicate<String> filterFirstLine = 
          line -> !(
           "Name".equals(line.split("\t", -1)[0]) 
            && "Hobby".equals(line.split("\t", -1)[1]) 
         ); 
    
         //Implementation 1 returns Arrays as asked. 
    
         System.out.println("==ArrayList=="); 
         fileInputStream = StreamTests.class.getResourceAsStream(filepathInSamePackage); 
         bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream)); 
    
         bufferedReader 
          .lines() 
          .filter(filterFirstLine) 
          .map(s -> { 
          String[] splitStrings = s.split("\t", -1); 
          return Arrays.asList(splitStrings); 
          }).forEach(System.out::println); 
    
         //Implementation 2 returns HashMap as another example 
    
         fileInputStream = StreamTests.class.getResourceAsStream(filepathInSamePackage);  
         bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream)); 
         System.out.println("\n==HashMap=="); 
    
         bufferedReader 
          .lines() 
          .filter(filterFirstLine) 
          .map(s -> { 
          String[] splitStrings = s.split("\t", -1); 
          HashMap<String, String> stringStringMap = new HashMap<>(); 
          stringStringMap.put(splitStrings[0], splitStrings[1]); 
          return stringStringMap; 
          }).forEach(System.out::println); 
        } 
        catch (Exception e) { 
         e.printStackTrace(); 
        } 
        } 
    } 
    

    Ve çıkış

    ==ArrayList== 
    [Susy, eat fish] 
    [Anna, gardening] 
    [Billy, bowling with friends] 
    
    ==HashMap== 
    {Susy=eat fish} 
    {Anna=gardening} 
    {Billy=bowling with friends} 
    
  • İlgili konular