2013年11月30日土曜日

開発環境

初めてのコンピュータサイエンス(Jennifer CampbellPaul GriesJason MontojoGreg Wilson(著)長尾 高弘(翻訳))の9章(集合と辞書)、9.5(練習問題)、13をDartで解いてみる。

その他参考書籍

9.5(練習問題)、13.

コード

sample.dart

import 'dart:html';
import 'dart:async' as async;

void main() {
  InputElement input = querySelector('#f0');
  InputElement run = querySelector('#run_dart');
  InputElement clear = querySelector('#clear');
  Element pre = querySelector('#pre0');
  input.multiple = true;
  input.accept = 'text/*';
  run.onClick.listen((MouseEvent event){
    String result = '${window.navigator.userAgent}\n';
    try{
      List<File> files = input.files;
      ((){
        var completer = new async.Completer();
        int n = 0;
        List<String> strs = [];
        for(File file in files){
          FileReader reader = new FileReader();
          reader.readAsText(file);
          reader.onLoad.listen((Event event){
            String s = reader.result;
            strs.addAll(s.split('\n'));
            n += 1;
            if (n == files.length){
              completer.complete(strs);
            }
          });
        }
        return completer.future;
      })().then((List<String> strs){
        Map<int, List<String>> m = freqMap(countBirds(strs));
        List<int> nums = m.keys.toList();
        nums.sort((int n, int m) => n - m);
        nums.forEach((int n){
          result += '$n\n';
          m[n].forEach((String s) => result += ' $s\n');
        });
        pre.text = result;
      });
    } catch(e){
      result += '$e\n';
      pre.text = result;
    }
  });
  clear.onClick.listen((MouseEvent event) => pre.text = '');
}

Map countBirds(List<String> strs){
  Map<String, int> result = {};
  for (String s in strs){
    String t = s.trim();
    if (t != ''){
      if (result.containsKey(t)){
        result[t] += 1;
      } else {
        result[t] = 1;
      }
    }
  }
  return result;
}

Map<int, List<String>> freqMap(Map<String, int> m){
  Map<int, List<String>> result = {};
  m.forEach((String s, int n){
    if (result.containsKey(n)){
      result[n].add(s);
    } else {
      result[n] = [s];
    }
  });
  return result;
}
















						

0 コメント:

コメントを投稿