HashMapのキーにアスペクト比を設定したくて作ってみた。
Map<Aspect, HashSet<Camera.Size>>
↑こういうのをしたい
コピペは自己責任で。
バグっても責任取れませんので。
Javaの事はよく知らないので、比較はfloatじゃなく100倍したintを使用。
コンストラクタでアスペクト比を計算して、クラス変数で保持するとなお良さそう。
改良はこれを読んでいる貴方への課題ということで。
equals()とhashCode()さえオーバーライドすればいいみたい。
import java.io.Serializable; /** アスペクト比を表すクラス、インスタンス化したら変更はできないつくり */ public class Aspect extends Object implements Serializable { private static final long serialVersionUID = 1L; //実際のwidth, heightは重要でないためprivate private int w; private int h; //一般的なアスペクト比 public static final int A_235_1 = 235; public static final int A_18_9 = 200; public static final int A_16_9 = 178; public static final int A_16_10 = 160; public static final int A_3_2 = 150; public static final int A_SQRT2_1 = 141; public static final int A_4_3 = 133; public static final int A_5_4 = 125; public static final int A_1_1 = 100; /** * @param w 長辺 * @param h 短辺 */ public Aspect(int w, int h){ this.w = w; this.h = h; } /** アスペクト比を小数第2位で丸めた数値 */ public float getRoundAspect(){ return (float)Math.round((float)w/h*100)/100; } /** アスペクト比を小数第2位で丸めた文字列 */ public String getRoundAspectString(){ return String.format("w/h=%.2f", (float)w/h); } /** アスペクト比を100倍して四捨五入した値 */ public int getRoundAspect100(){ return Math.round((float)w/h*100); } @Override public String toString(){ switch(this.getRoundAspect100()){ case Aspect.A_235_1:return "2.35:1"; case Aspect.A_18_9:return "18:9"; case Aspect.A_16_9:return "16:9"; case Aspect.A_16_10:return "16:10"; case Aspect.A_3_2:return "3:2"; case Aspect.A_SQRT2_1:return "Paper"; case Aspect.A_4_3:return "4:3"; case Aspect.A_5_4:return "5:4"; case Aspect.A_1_1:return "1:1"; default:return this.getRoundAspectString(); } } /** 同一のアスペクト比かどうか */ @Override public boolean equals(Object obj) { if (!(obj instanceof Aspect)) { //nullもはじかれる return false; } return this.getRoundAspect100() == ((Aspect) obj).getRoundAspect100(); } /** 同一のアスペクト比かどうか */ public boolean equals(int pW, int pH) { return this.equals(new Aspect(pW, pH)); } /** return getRoundAspect100() */ @Override public int hashCode() { return this.getRoundAspect100(); } }