Java初心者がTreemapを使用して速度データを管理する方法

このQ&Aのポイント
  • Treemapを使用して最新の速度データを管理する方法を説明します。
  • 時間と速度のデータを Treemap に保存し、重複を削除して時間順にソートします。
  • Treemap を使用する場合、最後から2番目の要素を取得する方法も説明します。
回答を見る
  • ベストアンサー

Treemapについて

java 初心者です. とある動体のシミュレーションをするプログラムを書いているのですが, (過去の)速度データを10個ほど保存しておき,最新の速度データ2つを使って,今現在の加速度を求めたいです. 例: リアルタイムに時間と速度のデータがばらばらに入力されます. 時間(double型) 速度(double型) 1.65       51.0 1.55        50.0 1.75        52.0 1.65        51.0 1.75        52.0 ↓重複を削除して時間順に保存 時間(double型) 速度(double型) 1.55        50.0 1.65        51.0 1.75        52.0 ↓最新のデータを2つ(後ろ2つ)取り出す 時間(double型) 速度(double型) 1.65        51.0 1.75        52.0 このようなことをしたいです. 私としては,keyを時間,valueを速度としたTreemapの利用を考えているのですが,何か他にいい方法などあれば教えていただきたいです. また,Treemapを用いる場合,最後から2番目の要素を簡単に取り出す方法はないでしょうか? 伝わりにくければ申し訳ないですが,よろしくお願いします.

noname#246292
noname#246292
  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • teketon
  • ベストアンサー率65% (141/215)
回答No.1

こんな感じ?カッコ悪いけど。 import java.util.Iterator; import java.util.TreeSet; public class Recorder { private TreeSet<Record> records = new TreeSet<Record>(); void add(double time,double speed){ if(records.size()>=10){ records.pollFirst(); } records.add(new Record(time, speed)); } void printLast2records(){ if(records.size()>=2){ //後ろ2件を取り出す処理 Iterator<Record> iRecord = records.descendingIterator(); Record[] arryRecord = new Record[]{iRecord.next(),iRecord.next()}; for(int i=arryRecord.length-1;i>=0;i--){ System.out.println(arryRecord[i]); } }else{ System.out.println("記録が少ない"); } } void printAll(){ for(Record record:records){ System.out.println(record); } } public static void main(String[] args) { Recorder recorder = new Recorder(); recorder.add(1.65,51.0); recorder.add(1.55,50.0); recorder.add(1.75,52.0); recorder.add(1.65,51.0); recorder.add(1.75,52.0); //最新2件を表示 recorder.printLast2records(); System.out.println("--------------------"); //全件表示 recorder.printAll(); } } class Record implements Comparable<Record>{ private Double time; private Double speed; public Record(double time,double speed){ this.time = new Double(time); this.speed = new Double(speed); } @Override public int hashCode() { return time.hashCode(); } @Override public boolean equals(Object obj) { return time.equals(obj); } public String toString(){ return time + "\t" + speed; } @Override public int compareTo(Record o) { return time.compareTo(o.time); } }

noname#246292
質問者

お礼

わざわざプログラムまで示していただいて,ありがとうございました.

関連するQ&A

  • phpで重複チェック

    phpの重複チェック phpで配列の重複データをチェックして、重複しているデータを表示しようとしています。 foreach ($arry as $key => $value) { $err_count = 0; foreach ($arry as $key => $value2) { if ($value == $value2) { $err_count++; if ($err_count >= 2) { echo "重複".$value2; } } } } としているのですが、 同じモノが2回表示されて困っています。 重複しているデータは一回だけ表示したいのですが、 なにか方法ないでしょうか?

    • ベストアンサー
    • PHP
  • 宇宙の膨張速度が加速しているそうですが、、、、、

    ここ10年程の宇宙物理学の進歩によって、宇宙の膨張速度が加速していることが解ったそうですね。 エネルギーの保存則から考えると、膨張しつづけている宇宙では単位容積あたりのエネルギー密度が低下している訳ですから、膨張速度を加速するエネルギーが調達できないと思うのですが、、。 宇宙の膨張速度が一定ではなく、減速でもなく、加速であるという最新の観測事実は、エネルギーの保存則を覆すものなのでしょうか? 高校学校の物理程度の言葉で教えて頂けるとありがたいです。

  • 位置データからの速度、加速度計算

    位置データから速度、加速度を求めるときに今では位置の差分から速度、加速度を求めているのですが、差分では最初の速度加速度のデータが出ないというように少しずれがありますよね? なのでずれのないようにmatlabで求めたいのですがほかの方法知っている人いますか? 微分の関数などで近似的に求められればいいと思うのですが…

  • ホームページのデータを定期的に自動ダウンロードしたい

    ホームページのデータ(javascriptのファイル)を自動で時間ごとに保存したいのですがなにかよい方法はあるでしょうか? (リアルタイムのデータがJSファイルで保存されていて、そのファイルが5分間隔で自動更新されているので、1時間毎くらいに自動で時間毎に保存したい。 ホームページ自体は、他のホームページなので、サーバー自体にしかけられません。)

  • オンラインシュミレーション

    kingsageのようなオンラインシュミレーションゲームはありますか? kingsageみたいに時間をとらないやつが望ましいです。それとなるべく最近始まった感じのほうが追いつきやすいのでありがたいです。 それと、かなり複雑でもいいので戦略シュミレーションゲームを教えていただけるとありがたいです。 まあリアルタイムで進む感じですかね。具体的に言うとEND WARとかです。 それとは別の要素で資源を確保したりだとか頭使いそうなやつも教えていただきたいです。 値段に見合うクオリティーであればお金は出せますので、有料でも大丈夫です。 ハードとしてはPS3かPCゲームですかね。 ぜひ皆さんのご投稿お待ちしております。

  • MATLAB でのデータ保存について

    MATLAB でシミュレーションを行なっているのですが データの保存方法がいまいちわかりません. グラフに出力してグラフを保存する事はできるのですが データを数値としても保存しておきたいので. save [ファイル名] [変数名] -ascii としても見やすいデータではないので なにかいいデータの保存方法はありませんか? データの利用法は OpenGL によるアニメーションのためです. よろしくお願いします.

  • 一意の文字列を取得したい

    同時に同じファイル名のファイルをアップロードしたときに、一意の文字列を付けて保存をして重複しないように保存をしたいです。 数値でも文字でもいいのですが、Javaで一意の文字列を取得する方法ってありますか? 宜しくお願いします。

    • ベストアンサー
    • Java
  • javaの不思議

    C言語をたしなむ程度にやっているものです。 Javaを勉強していたのですが、不思議だなと思ったので質問させてください。 Integer value = new Integer(30); value.doubleValue() // <- double型に変換している このプログラムだとvalueはintなのにあらかじめdoubleに変換できることを想定しています。 C言語の癖なのかしらないですが、型変換をするならクラスメソッドではなくキャストするか、 メソッドに投げる(Integer.toString←stringにする例ですが)。 この2つの方法が自然な型変換だと思うのですが、変でしょうか?

    • ベストアンサー
    • Java
  • エクセルVBAについて質問です。

    現在、マクロで重複データを削除する処理しています。 一応動作はするのですが、すごく遅いです。 およそ私のPC(XPのQuadコア)で1行処理するのに約0.85秒かかっています。 データが1万行以上もあるようなときは、何時間もかかってしまいます。 エクセルのデータは、以下のように、 A列とB列に文字列が何行にも渡って入っているものです。 A列   B列 AAA BBB CCC DDD EEE FFF GGG BBB CCC HHH CCC DDD (以下同様) 上のようなシートで、A列とB列の両方について重複する行を削除したいと思っています。 上記例だと、一番最後の「CCC-DDD」の箇所を削除したいです。 そこで以下のようなマクロを組みました。 (1)はじめに重複をチェックする変数(A列・B列)を取得します。 (2)上から順にチェックを開始します。 (3)A列・B列双方が取得した変数と一緒なら重複カウンターに1を加える。 (1回目の出現では削除しない) (4)チェックを続け、重複カウンターが2以上になった行は削除する。 (5)上記を空白行まで繰り返す。 というような流れです。 (マクロ記述の途中部分からです) '重複する行を削除 counter3 = 1 Do search_word1 = Cells(counter3, 1).Value search_word2 = Cells(counter3, 2).Value counter4 = 1 double_counter = 0 Do If Cells(counter4, 1).Value = search_word1 And Cells(counter4, 2).Value = search_word2 Then double_counter = double_counter + 1 If double_counter > 1 Then '二度以上出現した場合から削除する Cells(counter4, 1).EntireRow.Delete counter4 = counter4 - 1 End If End If counter4 = counter4 + 1 Loop Until Cells(counter4, 1).Value = "" counter3 = counter3 + 1 Loop Until Cells(counter3, 1) = "" 初心者なのもので、冗長や不適切な箇所などあるかと思います。 より効率的、あるいは、より早くできる書き方がありましたら、 ぜひともお教え下さい・よろしくお願いします。

  • ライブドアの内部事情を知る人が遊んでいた?

    一年以上前でしょうか、ある証券会社の株投資シミュレーションをやっていたことが ありました。それは実際の株のリアルタイムデータを使って運営していたようなのですが、 上位に来る人はいつも同じような人で、必ずといっていいほど バリュークリックジャパン(後にライブドアマーケティング、現在メディアイノベーション)の 株で儲けていました。これって、当時の内部事情を知る人が証券会社のシミュレーション でもインサイダーをやっていたってことでしょうか?もしかしたらここから早めに捜査の手を 入れることができたのではないでしょうか? ちなみに私は実際に取引をしたことが無いし、知識もありません。もしかしたら、 おかしなことを言っているかもしれませんが、その時は突っ込みよろしくお願いします。

専門家に質問してみよう