ということで3分クッキング。というか6でそんな便利なの出てたのか。知らなかった。

package test;

import java.util.Comparator;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;

public class Test {
public static void main(String[] args) {
SortedMap<Integer, String> sourceMap = new TreeMap<Integer, String>();
sourceMap.put(1, "hoge01");
sourceMap.put(2, "hoge02");
sourceMap.put(3, "hoge03");

SortedMap<Integer, String> destMap = new TreeMap<Integer, String>(new Comparator<Integer>() {
public int compare(Integer o1, Integer o2) {
return -(o1.compareTo(o2));
}
});

int limit = 2;
for(Map.Entry<Integer, String> entry:sourceMap.entrySet()) {
if(entry.getKey().intValue() > limit) break;
destMap.put(entry.getKey(), entry.getValue());
}

for(Map.Entry<Integer, String> entry : destMap.entrySet()) {
System.out.println(entry);
}
}
}

実行結果↓
2=hoge02
1=hoge01
java 修得度問題
↑で、javaの問題が出されていたのでやってみた。
正直面白かったのだけど、結構手こずった・・・
ぱっと答えられたの(3)ぐらいか。。

こっから先は自分なりの回答を書くので、自力で解きたい人は先にリンク先いってください。




(1) スレッドダンプ。だけど動作を説明せよっていわれてもそのメカニズム全然しらないなあと愕然となった。そのうち別の機会にjvmの挙動として調べてみよう・・・
あといつもkill -3でやってたけどSIGQUITのほうがかっこいいな。


(2)
package sample;

class A<A>{
class B<B>{
public void out(){
System.out.print(a);
System.out.print("-");
System.out.println(b);
}

private A a;
private B b;
}

/**
* @param args
*/

public static void main(final String... args){
sample.A<String> instanceA = new sample.A<String>();
sample.A<String>.B<String> instanceB = instanceA.new B<String>();

instanceB.a = "20";
instanceB.b = "test";
instanceB.out();
}
}



(3)
package sample;

class A{
static interface AA{
String value();
}

enum B implements AA{
A,
B,
C;

private B(){

}
public String value(){
switch (this) {
case A:
return "hoge";
case B:
return "fuga";
default:
return "hogehoge";
}
}
}

/**
*
*
* @param args
*/

public static void main(final String... args)
{
System.out.println(B.A.value());
System.out.println(B.B.value());
System.out.println(B.C.value());
}
}


(4) まずmainメソッドのsysout内を分解してみると
C.class.getAnnotation(B.class).value()        // D.class
.getAnnotation(B.class).value() // A.class
.newInstance().value() // A#value()

ということでAのvalue()メソッドが最後に呼ばれている。
value()メソッドを分解してみる。
return this.getClass()  //A.class
.getAnnotation(B.class).value() //C.class
.newInstance().getClass() //C.class
.getAnnotation(B.class).value() //D.class
.newInstance().value(); //D#value()

今度はDのvalue()メソッドを呼んでいる。
同じように追っかけると、
return this.getClass()  //D.class
.getAnnotation(B.class).value() //A.class
.newInstance().getClass() //A.class
.getAnnotation(B.class).value() //C.class
.newInstance().value(); //C#value()

ということで最終的にC#value()が呼ばれるので、"fugafuga"が出力される。

って元記事のはてブみたらscalaのひととかが回答のっけてた・・・
でもだいたいおんなじ感じだった。
いうても結構僕は(2)に手こずりました・・・
低レベルすぎて泣けてくる・・・