第9回セミナー

大量データの処理(ファイル入力)

配列を使い、データ数がファイルの先頭に書いてある場合

import java.io.*;

class Sample9 {
  public static void main(String[] args){
    try{
      BufferedReader br=new BufferedReader(new FileReader("test2.txt"));
      String str;

      // 最初の数字を読み込んでデータ数とする
      str=br.readLine();
      int num=Integer.parseInt(str);

      int[] test=new int[num];

      for(int i=0;i<test.length;i++){
        str=br.readLine();
        test[i]=Integer.parseInt(str);
      }

      int max=test[0];
      int min=test[0];
      for(int i=0;i<test.length;i++){
        if(max<test[i]) max=test[i];
        if(min>test[i]) min=test[i];
        System.out.println(test[i]);
      }
      System.out.println("最大値は"+max+"です。");
      System.out.println("最小値は"+min+"です。");

      br.close();
    }
    catch(IOException e){
      System.out.println("入出力エラーです");
    }
  }
}

配列を使い、データ数がファイルにない場合

import java.io.*;

class Sample9 {
  public static void main(String[] args){
    try{
      RandomAccessFile br=new RandomAccessFile("test2.txt","r");
      String str;

      int num=0;
      while((str=br.readLine())!=null) num++;
      int[] test=new int[num];
      br.seek(0);

      for(int i=0;i<test.length;i++){
        str=br.readLine();
        test[i]=Integer.parseInt(str);
      }

      int max=test[0];
      int min=test[0];
      for(int i=0;i<test.length;i++){
        if(max<test[i]) max=test[i];
        if(min>test[i]) min=test[i];
        System.out.println(test[i]);
      }
      System.out.println("最大値は"+max+"です。");
      System.out.println("最小値は"+min+"です。");

      br.close();
    }
    catch(IOException e){
      System.out.println("入出力エラーです");
    }
  }
}

可変長配列を使う場合

import java.io.*;
import java.util.*;

class Sample9 {
  public static void main(String[] args){
    try{
      BufferedReader br=new BufferedReader(new FileReader("test2.txt"));
      String str;
      ArrayList<Integer> test=new ArrayList<Integer>();

      while((str=br.readLine())!=null){
        test.add(Integer.parseInt(str));
      }

      int max=test.get(0);
      int min=test.get(0);
      for(int i=0;i<test.size();i++){
        if(max<test.get(i)) max=test.get(i);
        if(min>test.get(i)) min=test.get(i);
        System.out.println(test.get(i));
      }
      System.out.println("最大値は"+max+"です。");
      System.out.println("最小値は"+min+"です。");

      br.close();
    }
    catch(IOException e){
      System.out.println("入出力エラーです");
    }
  }
}

データを保持しない方法

import java.io.*;

class Sample9 {
  public static void main(String[] args){
    try{
      BufferedReader br=new BufferedReader(new FileReader("test2.txt"));
      String str;

      int max=Integer.MIN_VALUE;
      int min=Integer.MAX_VALUE;
      int num=0;
      double sum=0,sum2=0;
      while((str=br.readLine())!=null){
        int n=Integer.parseInt(str);
        if(max<n) max=n;
        if(min>n) min=n;
        num++;
        sum+=n;
        sum2+=n*n;
        System.out.println(n);
      }
      System.out.println("最大値は"+max+"です。");
      System.out.println("最小値は"+min+"です。");
      System.out.println("平均値は"+sum/num+"です。");
      System.out.println("標準偏差は"+Math.sqrt(sum2/num-(sum/num)*(sum/num))+"です。");

      br.close();
    }
    catch(IOException e){
      System.out.println("入出力エラーです");
    }
  }
}

コマンドライン引数の処理

import java.io.*;

class Sample10 {
  public static void main(String[] args){
    boolean f_max=false,f_min=false,f_ave=false,f_std=false;
    String name1=null,name2=null;
    int max_num=-1;

    // 引数処理
    int argnum=0;
    for(int i=0;i<args.length;i++){
      if(args[i].charAt(0)=='-'){
        switch(args[i].charAt(1)){
        case 'x': f_max=true; break;
        case 'n': f_min=true; break;
        case 'a': f_ave=true; break;
        case 's': f_std=true; break;
        case 'm': max_num=Integer.parseInt(args[++i]); break;
        }
      }
      else{
        switch(argnum++){
        case 0: name1=args[i]; break;
        case 1: name2=args[i]; break;
        }
      }
    }
    if(argnum!=2){
      System.err.println("Usage: java Sample10 [-options] data-name out-name");
      System.err.println("  -x : show max value");
      System.err.println("  -n : show min value");
      System.err.println("  -a : show average");
      System.err.println("  -s : show standard deviation");
      System.err.println("  -m N : max data num [N=inf]");
      System.exit(1);
    }

    // 統計量の計算
    try{
      BufferedReader br=new BufferedReader(new FileReader(name1));
      String str;

      int max=Integer.MIN_VALUE;
      int min=Integer.MAX_VALUE;
      int num=0;
      double sum=0,sum2=0;
      while((str=br.readLine())!=null){
        if(num==max_num) break;
        int n=Integer.parseInt(str);
        if(max<n) max=n;
        if(min>n) min=n;
        num++;
        sum+=n;
        sum2+=n*n;
        System.out.println(n);
      }
      if(f_max) System.out.println("最大値は"+max+"です。");
      if(f_min) System.out.println("最小値は"+min+"です。");
      if(f_ave) System.out.println("平均値は"+sum/num+"です。");
      if(f_std) System.out.println("標準偏差は"+Math.sqrt(sum2/num-(sum/num)*(sum/num))+"です。");

      br.close();
    }
    catch(IOException e){
      System.out.println("入出力エラーです");
    }
  }
}

ここまでの復習

問題1(Review1.java)

中間試験と期末試験の点数(100点満点)を入力し、次の条件で合格、不合格を判定するプログラムを作成せよ。

>java Review1
55 90
合格!

問題2(Review2.java)

キーボードから整数値を入力すると、そのサイズのバツ印を任意の全角文字で表示するプログラムを作成せよ。

> java Review2
5
○   ○
 ○ ○ 
  ○  
 ○ ○ 
○   ○

問題3(Review3.java)

入力された10進数の整数値を、16進数の数値に自力で変換して出力せよ。

> java Review3
123
7B

問題4(Review4.java)

ランダムな100個の2桁の整数を横並びでスペースで区切って表示し、それを小さい順に並べ替えて再度表示せよ。

> java Review4
23 54 77 93 10 11 ... 76 34 55
10 11 15 23 24 29 ... 91 93 98

問題5(Review5.java)

次のように、サイズを指定して市松模様を描画せよ。 ただし、サイズは外側の四角の数を表す。

Review5-1.png Review5-2.png

問題6(Review6.java)

問題7(Review7.java)

Javaセミナー2014


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS