3

よし、これがシナリオだ。私は常に一緒に行くキーの静的なペアを持っています。1 つのキーはインデックス (別名) で、もう 1 つのキーは説明 (別名または) です。これらのキーはすべて事前に知っているので、実際に変化するのは値だけで、新しいキーが追加されることはありません。intstringenum

ただし、値は、string、int、long などの任意の型にすることができます。一部の値は特異ではなく、複数の値で構成されています。ただし、各キーペアがどのタイプの値を指すかは事前にわかっています。

ほとんどの場合、値は常にインデックスを使用して設定されます。ただし、インデックス(int)または説明(文字列/列挙)のいずれかで値にすばやくアクセスできるようにしたい(ループはしないでください。キャストもしないでください)。また、インデックスを介して値にアクセスするときは、説明にもアクセスする必要があります

これは物事をより明確にするかもしれません:

1/Name ----> "danny"        //1 and Name are known in advance and always go together. also, they always point to a string
2/Age  ----> 24             //2 and Age are known in advance and always go together. also, they always point to an int
3/Time ----> 352343463463L  //3 and Time are known in advance and always go together. also, they always point to a long
4/Occupation    ---> [description] "magician"
                ---> [type] "entertainer"
                ---> [years] 3              //4 and Status are known in advance and always go together. also they will always point to 2 strings and and an int (or an object contraining 2 strings and an int...)

必要な機能:

set(1, "Jasmine");
get(1);             //returns "Jasmine"
get(Name);          //return "Jasmine"  (name can be either string or enum I suppose)
getDescription(1);  // returns Name (again, name could be either string or enum). this function could possibly be merged with get(1) to have it return both description and value in the first place.

set(2, 32);
get(2);             //returns 32
get(Age);            //returns 32
4

4 に答える 4

2

作成

class Entry {
  int index;
  String description;
  Object value;
}

2 つの HashMap を宣言します。

HashMap<Integer, Entry> idxValue=new HashMap<Integer, Entry>();
HashMap<String, Entry> descrValue=new HashMap<String, Entry>();

両方のテーブルで機能するエントリと値を格納および取得するメソッドを定義します。

于 2013-10-09T08:02:34.227 に答える
1

これには、私のTypedMapを使用できます。一言で言えば、キーの下の値としてあらゆる種類のオブジェクトを格納できるタイプ セーフなマップを提供します。

TypedMap map = new TypedMap();

String expected = "Hallo";
map.set( KEY1, expected );
String value = map.get( KEY1 ); // Look Ma, no cast!
assertEquals( expected, value );

List<String> list = new ArrayList<String> ();
map.set( KEY2, list );
List<String> valueList = map.get( KEY2 ); // Even with generics
assertEquals( list, valueList );

入力されたキーにすばやくアクセスできるようにするには、列挙型を使用することをお勧めします。

enum Key {
    Name(1) { @Override public TypedMapKey<String> getKey() { return NAME_KEY; },
    ...;

    private static Key[] byIndex = new Key[MAX_INDEX+1];
    static {
        for( Key key : values() ) { byIndex[key.index] = key; }
    }

    public static byIndex(int index) {
        return byIndex[index]; // I suggest non-null checks here if you have gaps
    }

    private Key(int index) {
        this.index = index;
    }

    public TypedMapKey<?> getKey() { throw new UnsupportedOperationException( "Please override"; ) }
}
于 2013-10-09T07:57:19.197 に答える
0

データを保持する単純なクラスを作成し、バッキング フィールドを持つ 、 などの Bean のようなプロパティをName作成します。Age

private int age; 

public getAge() { return age; } 

public setAge(int value) { age = value; }

@FieldInfoフィールドの序数とフィールドの説明を含むというカスタム アノテーションを作成します。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)    
public @interface FieldInfo {
    int ordinal();
    String description();
}

注釈を使用してデータ クラスを装飾します。

@FieldInfo(ord=1, description="Age")
private int age; 

public getAge() { return age; } 

public setAge(int value) { age = value; }

get()フィールド序数を使用して値を取得/設定できるユニバーサルメソッドとメソッドを含むデータクラスの基本クラスとset()、序数が指定されたフィールドの説明を返す getDescription() メソッドを作成します。リフレクションを使用this.getClass().getDeclaredFields()して取得するために使用してから、各フィールドの注釈を取得するために使用します。Fields[]Field.getAnnotation(FieldInfo.class)

データ クラスのプロパティは実行時に変更されないため、フィールドへのアクセスに序数を頻繁に使用する場合は、 2 つの静的ルックアップ<int, Field>を作成し、各データ クラス タイプを静的コンストラクターで高速化できます。<int, String>このアプローチを使用すると、注釈を拡張することでフィールドをさらに記述することができ、データ クラスは依然として従来のゲッター/セッターを持つ単純なクラスのままです。

于 2013-10-09T08:45:13.403 に答える