スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

【Java】HashMapのvalueで、sortしたかった

ハッシュの値でソートしたかった時がありまして、
その際に、以下のようなコードを記述しました。
※キーでソートではないです。

<概要>
key = ユニークな値
value = 重複する数字

読み込むデータが複数のカンマ区切りのデータで、最後のカンマ以降の値が数値となっている。
最後のカンマまでの値は、ユニークなキーになる。

<何がしたかったか>
カンマ区切りのデータを値と数値に分けて、数値を降順でソートして、同じ形式で出力する。

<迷走した部分>
TreeMAPで簡単にsortできると思っていたら、調べた限りできなくて迷走。。。
Webの素晴らしきログから、以下の方法が導きだせたので、同じようなところで
悩まれた方の手助けになればと。。。(プログラム素人なので、信頼性はありませんが。。。)

で、導きだしたのは、Comparatorを実装して、値を比較しreturnすることにより解消。
でも結局は、ハッシュでソートではなくて、配列とコレクションでのソートなので、
タイトルは若干の誤りがあるような、ないような。。。

<コード>

import java.util.*;
import java.util.regex.*;

class Sort{
public static void main(String [] args){
Sort sort = new Sort();
sort.execution();
}

void execution(){
ArrayList<String> data = new ArrayList<String>();
data.add("あいう,24,5");
data.add("test,8");
data.add("機械,20");
data.add("スーパー,14");
data.add("レスキュー,5,21");

Matcher m;
Pattern p = Pattern.compile("^(.*),(\\d+)$");
HashMap<String,Integer> hm = new HashMap<String,Integer>();

for(String s : data){
m = p.matcher(s);
if(m.matches()){
hm.put(m.group(1),Integer.parseInt(m.group(2)));
}
}

ArrayList<Map.Entry> array = new ArrayList<Map.Entry>(hm.entrySet());
Collections.sort(array,new Comparator<Object>(){
public int compare(Object o1, Object o2){
Map.Entry e1 =(Map.Entry)o1;
Map.Entry e2 =(Map.Entry)o2;
Integer e1Value = (Integer) e1.getValue();
Integer e2Value = (Integer) e2.getValue();
return (e2Value.compareTo(e1Value));
}
});

Iterator it = array.iterator();
while(it.hasNext()) {
Map.Entry obj = (Map.Entry)it.next();
System.out.println(obj.getKey() + "," + obj.getValue());
}
}
}



上記コード作成中にコンパイルした際に、以下のようなメッセージが出力されました。

注:Sort.java の操作は、未チェックまたは安全ではありません。
注:詳細については、-Xlint:unchecked オプションを指定して再コンパイルしてください。


そこで上記で言われた通りに『-Xlint:unchecked』指定で、再コンパイルしてみると
以下のメッセージが出力されました。

デスクトップ>javac -Xlint:unchecked Sort.java
Sort.java:33: 警告:[unchecked] 無検査変換です
検出値 : <anonymous java.util.Comparator>
期待値 : java.util.Comparator<? super java.util.Map.Entry>
Collections.sort(array,new Comparator(){
^
Sort.java:33: 警告:[unchecked] 無検査メソッド呼び出し: java.util.Collections
の <T>sort(java.util.List<T>,java.util.Comparator<? super T>) は (java.util
.ArrayList<java.util.Map.Entry>,<anonymous java.util.Comparator>) に適用されます。
Collections.sort(array,new Comparator(){
^
警告 2 個

デスクトップ>


で、これは配列とかをgenericsしていなかったから『未チェック』と注意されていたわけです。
上記部分は、Comparatorについての警告メッセージですが要は、以下のように該当する部分を
限定してあげることで、出力されなくなりました。

ArrayList array = new ArrayList(hm.entrySet());

ArrayList <Map.Entry> array = new ArrayList<Map.Entry>(hm.entrySet());


スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメント

非公開コメント

No title

compare()の中で文字列を分解してもいいなら,もうちょっと簡単になるかもしれません。
比較前に文字列を分解してしまう方式よりは遅くなってしまいますが……
---
import java.util.*;

public class Sort implements Comparator<String> {
public static void main(String[] args) {
Sort sort = new Sort();
sort.execution();
}
public void execution() {
ArrayList<String> data = new ArrayList<String>();
data.add("あいう,24,5");
data.add("test,8");
data.add("機械,20");
data.add("スーパー,14");
data.add("レスキュー,5,21");

Collections.sort(data, this);

for (String element : data) {
System.out.println(element);
}
}
public int compare(String o1, String o2) {
Integer key1 = new Integer(o1.substring(o1.lastIndexOf(',') + 1));
Integer key2 = new Integer(o2.substring(o2.lastIndexOf(',') + 1));

return key2.compareTo(key1);
}
}
---

No title

calotocenさん
助言ありがとうございます!
ちょっとしたテキストを読み込んで、ソートとかに便利そうですね。

頂いたコメントを基に、記事を書かせていただきました。
http://unyouman.blog100.fc2.com/blog-entry-5.html
プロフィール

unyouman

Author:unyouman
FC2ブログへようこそ!

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。