2016-11-06 7 views
1

Javaの.txtファイルに含まれているチルダ区切りテーブルの行データおよび列データを操作しようとしています。私は正常にスキャン/データを読んだが、リレーショナル代数のアクションをミラーリングするためにそれを操作する方法がわからないし、新しい.txtファイルにチルダ区切りのテーブルとして元のように書き込みますproject()のような別のメソッド。スキャナまたはバッファを使用して.txtファイルを読み込んだ後にJavaでテーブルデータを操作する

//restrict the cars table to toyotas producing a table named toyotas  
Algebra.Restrict("cars","MAKE='Toyota'","toyotas"); 

//project just three columns from the toyotas table producing a table named answer  
Algebra.Project("Toyotas","Make,Model,Price","answer"); 

//display the contents of the answer table  
Algebra.Display("answer"); 

出力は次のようになります:

MAKE MODEL PRICE 
---------------- 
Toyota Camry 18000  
Toyota Tacoma 19000  
Toyota Highlander 35000 

たとえば、私はドライバプログラムの本体は、次のようになりますので、唯一のトヨタ車への出力が制限されますrestrict()メソッドを作成したいですalgebra.Restrのための次のコードを使用してcars.txt

MAKE~MODEL~TYPE~PRICE 

Toyota~Camry~Sedan~18000 

Toyota~Tacoma~Truck~19000 

Ford~Mustang~Sport~21000 

Chevrolet~Corvette~Sport~48000 

Ford~F150~Truck~25000 

Toyota~Highlander~SUV~35000 

からの入力ICT( "フォード"、 ""、 "トラック");:私が取得

public void Restrict(String a, String b, String c)throws FileNotFoundException, IOException{ 
    { 
     Scanner x = null; 
     try 
     { 
      x = new Scanner(new File("cars.txt")); 
     } 
     catch (FileNotFoundException e) 
     { 
      e.printStackTrace(); 
     } 
     ArrayList<String[]> arr = new ArrayList<String[]>(); 
     while (x.hasNext()) 
     { 
      String str[] = x.next().split("~"); 
      arr.add(str); 
     } 

     for (String[] column : arr) 
     { 
      if (column[0].equals(a)) 
      {System.out.println(column[0] + " " + column[1] + " " + column[2]); 

       // save table to disk  
       PrintWriter outputfile = new PrintWriter("RestrictTable.txt"); 
       outputfile.print(column[0] + " " + column[1] + " " + column[2]); 
       outputfile.close(); 

      } 


     } 
     for (String[] column : arr) 
     { 
      if (column[1].equals(b)) 
      {System.out.println(column[0] + " " + column[1] + " " + column[2]); 

       // save table to disk  
       PrintWriter outputfile = new PrintWriter("RestrictTable.txt"); 
       outputfile.print(column[0] + " " + column[1] + " " + column[2]); 
       outputfile.close(); 

      } 



     } 
     for (String[] column : arr) 
     { 
      if (column[2].equals(c)) 
      {System.out.println(column[0] + " " + column[1] + " " + column[2]); 

       // save table to disk  
       PrintWriter outputfile = new PrintWriter("RestrictTable.txt"); 
       outputfile.print(column[0] + " " + column[1] + " " + column[2]); 
       outputfile.close(); 

      } 


     } 
         System.out.println("NEW TABLE SAVE TO DISK"); 




    } 


    } 
    public void Project(String a)throws FileNotFoundException, IOException{ 
     { 
     Scanner x = null; 
     try 
     { 
      x = new Scanner(new File("cars.txt")); 
     } 
     catch (FileNotFoundException e) 
     { 
      e.printStackTrace(); 
     } 
     ArrayList<String[]> arr = new ArrayList<String[]>(); 
     while (x.hasNext()) 
     { 
      String str[] = x.next().split("~"); 
      arr.add(str); 
     } 

     for (String[] car : arr) 
     { 
      if (car[0].equals(a)) 
      { 
       System.out.println(car[0] + " " + car[1] + " " + car[2]); 

       // save table to disk  
       PrintWriter outputfile = new PrintWriter("ProjectTable.txt"); 
       outputfile.print(car[0] + " " + car[1] + " " + car[2]); 
       outputfile.close(); 

      } 

     } 
         System.out.println("NEW TABLE SAVED TO DISK/ProjectTable.txt"); 




    } 


    } 

出力:

Ford Mustang Sport 
Ford F150 Truck 
Toyota Tacoma Truck 
Ford F150 Truck 
NEW TABLE SAVE TO DISK 

所望の出力

MAKE~MODEL~TYPE 
Ford~F150~Truck 
NEW TABLE SAVE TO DISK 

かで少なくとも

Ford F150 Truck 
NEW TABLE SAVE TO DISK 

答えて

0

手順1)データを変数に読み込んでデータオブジェクトを作成します。最も単純なのは配列とリストです。car classを作成してキー値のペアを作成した方が良いでしょうが、簡単にするために、ここでは潜在的な解決策です。

import java.io.File; 
import java.io.FileNotFoundException; 
import java.util.ArrayList; 
import java.util.Scanner; 

public class cars 
{ 

    public static void main(String[] args) 
    { 
     Scanner x = null; 
     try 
     { 
      x = new Scanner(new File("cars.txt")); 
     } 
     catch (FileNotFoundException e) 
     { 
      e.printStackTrace(); 
     } 
     ArrayList<String[]> arr = new ArrayList<String[]>(); 
     while (x.hasNext()) 
     { 
      String str[] = x.next().split("~"); 
      arr.add(str); 
     } 

     for (String[] car : arr) 
     { 
      if (car[0].equals("Toyota")) 
      { 
       System.out.println(car[0] + " " + car[1] + " " + car[2] + " " + car[3]); 
      } 
     } 
    } 
} 

出力:

Toyota Camry Sedan 18000 
Toyota Tacoma Truck 19000 
Toyota Highlander SUV 35000 

私は5分でこれをしなかったが、あなたは簡単な方法restrictを作るためのテンプレートとして使用することができます。テンプレートも同様です。

private boolean restrictBy (String make){ 
    if make.equals("Totota") { 
    return true; 
    } else { 
    return false; 
    } 
} 

EDIT:

File outFile = new File ("output.txt"); 
FileWriter fWriter = null; 
try { fWriter = new FileWriter (outFile); } 
catch (IOException e) { e.printStackTrace(); } 
PrintWriter pWriter = new PrintWriter (fWriter); 
for (String[] car : arr) 
{ 
    if (restrictBy(car, "Ford" , "", "Truck")) 
    { 
     System.out.println(car[0] + " " + car[1] + " " + car[2] + " " + car[3]); 
     pWriter.println(car[0] + " " + car[1] + " " + car[2] + " " + car[3]); 
    } 
} 
pWriter.close();  

及び方法restrictBy

private static boolean restrictBy (String[] car, String make, String model, String type) { 
    boolean filtered = true; 
    if (make.length() > 0 && !car[0].equals(make)) 
    { 
     filtered = false; 
    } 
    if (model.length() > 0 && !car[1].equals(model)) 
    { 
     filtered = false; 
    } 
    if (type.length() > 0 && !car[2].equals(type)) 
    { 
     filtered = false; 
    } 
    return filtered; 
} 
+0

NICE!ありがとう、ちょうど私が変数にデータを取得する方法を把握しようとしていたものです。だからプロジェクトのためには、私は最初の3つのcoulmns –

+0

@SteveRogersええ、私はあなたが表示したいものを選択して選択することができますを投影したいと思うように同じだろうと思います。 'car []' 0-3はすべて車の識別子ですが、すべてを変数に保ちますが、何を出力するかは決めることができます。これがあなたの質問に答えた場合は、回答としてマークしてください。私は本当にポイントを使用することができる私は新しい: – JordanGS

+0

@SteveRogers 'System.out.println(car [0] +" "+ car [1] +" "+ car [2] +" "car [3 ]); 'はすべて3列で、必要のないものを削除します。例えば、 'Camry 18000'と' System.out.println(car [1] + "" + car [3]); 'のような出力は2列目と4列目だけです。 :) – JordanGS

0

ストリームを使用するには、Java 8が必要です。制限

  • filter

  • プロジェクト:map

  • ディスプレイ:collect

あなたがこれを使用すると、Streamの方法に言及した関係代数演算のマッピングですあなたのアプローチの欠点を認識している必要がありますリレーショナルデータベース管理システムの息子:

  • は(うまくスケールしない)多くのデータの場合には大量のメモリを必要

  • ませんクエリの最適化

  • ませインデックス

  • 取引なし

  • 制限なし

+0

おかげでたくさん、私はちょうどしたい場合(第2のための関係代数を忘れる)たとえば言うことができますクエリを模倣するSELECT * FROM table WHERE make = 'Toyota'; - それを達成するための最善のルートは何でしょうか。また、チュートリアルやYouTube動画へのリンクがあれば素晴らしいかもしれません。もう一度おねがいします。私はSQLの人です。Javaの新しいトピックです。何らかの理由で私たちの教授が、青色のJavaプログラムを作成したいと思っています。 –

+0

フィルタのシーケンスを適用してマップを作成してください。より多くの情報は、ここで見つけることができます:http://www.angelikalanger.com/Articles/EffectiveJava/74.Java8.Streams-Overview/74.Java8.Streams-Overview.html。 「Javaストリーム」をグーグルで検索することで、より多くの情報を見つけるのは難しいことではありません。 – mm759

関連する問題