2017-07-11 5 views
-1

私はEclipse IDE上で動作するJavaを使用しています。 私はここでは、このインクリメントを使用してカラムとして機能し、分割後にarraylistに値を追加

//name|money|password 

john|900|john321 
mark|300|mark321 

のようなテキストファイルから

Name: John 
Money: 900 
Password: john321 

Name: Mark 
Money: 300 
Password: mark321 

の成果を達成しようとしていますことは、私が試したものです:私は、変数を使用することにしようとしています

public static void ReadFile() throws IOException {  
    FileReader rf = new FileReader("Data.dat"); 
    BufferedReader br = new BufferedReader(rf); 
    String reader; 
    ArrayList<String> dataInfo = new ArrayList<String>(); 
    while((reader = br.readLine())!=null) 
    { 
     dataInfo.add(reader); 
    } // end of while loop 
    br.close(); 
    ArrayList<String> name = new ArrayList<String>(); 
    ArrayList<String> money = new ArrayList<String>(); 
    ArrayList<String> password = new ArrayList<String>(); 

    for(int i =0; i<dataInfo.size();i++) {  
      String[] test = dataInfo.get(i).split("\\|"); 
      int j =0; 
      for(String data : test) { 
       //System.out.println(data); // this print like what i wanted from the above outcome i posted 
       if(j==0){ 
        name.add(data); 
        System.out.println(name); // This works well. 
        j++; 
       } 
       if(j==1){ 
        password.add(data); 
        System.out.println(password); //ERROR this print the name instead   
        j++; 
       } 
       if(j==2){ 
        money.add(data); 
        System.out.println(money); //ERROR this print the name instead 
        j++; 
       } 
      } 
    }//end of for-loop 

    for(int k =0;k<name.size();k++) 
    { 
     System.out.println("Name: " +name.get(k)); 
     System.out.println("Money: " +money.get(k)); 
     System.out.println("Password: " +password.get(k)); 
     System.out.println("\n"); 
    } 
} 

jは、プログラムをさらにダウンすると、フィルター検索の名前、金額、パスワードを使用する必要があるため、列として機能します。 forループの繰り返しが必要です。なぜなら、ユーザが削除したいユーザの名前を入力するときに、テキスト全体を削除したいからです。 if(name.get(i) = john) { //delete password.get(i) , money.get(i) }しかし、今問題は、配列リストに追加した値が常に名前だけであることです。ここで、System.out.println(data)はすべてを出力します。

答えて

2

あなたは現在、それはまず

if j == 0 then increment j 

を行いますよう、それはきれいな方法は、(IMO)

String[] test = dataInfo.get(i).split("\\|"); 
if (test.length == 3) { 
    just use test[0] test[1] and test[2] 
} 
else { 
    // otherwise this is bad data - need to do something special 
} 

の場合を行うことです。とにかく

if j == 1 - yes it is 

を行いますelse if文を必要としますあなたは本当にjのような構文を使用することを主張し、なぜfor-eachブロック、なぜちょうどpassword、あなたはそれは三つのフィールドnameと1 Objectを持っているために、より理にかなって3のArrayListの

ArrayList<String> name = new ArrayList<String>(); 
ArrayList<String> money = new ArrayList<String>(); 
ArrayList<String> password = new ArrayList<String>(); 

を使用しない理由

for (int j = 0; j < test.length; j++) 

また伝統的なforループを使用moneyありません

これらのオブジェクトのArrayListを持つ

ArrayList<MyObject> people = new ArrayList<MyObject>(); 
1

あなたの問題は、あなたのifブロックがプログラムフローのために絶対に何もしていないということです。それぞれのブロックは、それぞれの反復で入力されます。なぜなら、そのケースは互いに排他的ではないからです。

elseを使用して、反復ごとに1ブロックしか入力されないようにする必要があります。

for(String data : test) { 
      //System.out.println(data); // this print like what i wanted from the above outcome i posted 
      if(j==0){ 
       name.add(data); 
       System.out.println(name); // This works well. 
       j++; 
      } 
      else if(j==1){ 
       password.add(data); 
       System.out.println(password); //ERROR this print the name instead   
       j++; 
      } 
      else if(j==2){ 
       money.add(data); 
       System.out.println(money); //ERROR this print the name instead 
       j++; 
      } 
     } 
0

あなたは以下のように再配置し、あなたの場合はブロックする必要があります場合は、他の

if(j==2){ 
     password.add(data); 
     System.out.println(password);   
     j++; 
    } 
    if(j==1){ 
     money.add(data); 
     System.out.println(money); 
     j++; 
    } 
    if(j==0){ 
     name.add(data); 
     System.out.println(name); 
     j++; 
    } 

他の賢明な利用。

最初のブロックに行くと、ブロックj == 0 がjの値を1に変更するため、コードにエラーが表示されます。ブロックj == 1の場合は2番目に入ります。 しかし、依然として変数データの値はnameです。データはお金とパスワードを持っていますfor(String data : test)

注:また、私はお金を持っていると思いますj == 2あなたのテキストファイルに応じてパスワードを持っています。あなたはそれをifブロックで間違って指定しました。

0

java.util.Scannerを使用してファイルを1行ずつ読むことはできません。各行を|で分割し、対応するリストに分割された値を追加します。

ArrayList<String> name = new ArrayList<String>(); 
     ArrayList<String> money = new ArrayList<String>(); 
     ArrayList<String> password = new ArrayList<String>(); 

     Scanner scanner = new Scanner(new File("filePath")); 
     while (scanner.hasNextLine()) { 
      String[] split = scanner.nextLine().split("\\|"); 
      if(split.length==3) { 
       name.add(split[0]); 
       money.add(split[1]); 
       password.add(split[2]); 
      } 
     } 
     scanner.close(); 
関連する問題