2010-04-03 23 views
1

我對Java還沒有太多的經驗,我希望有人能夠引導我走向正確的方向,因爲現在我覺得我只是在靠牆撞我的頭。幫助兩個類之間的字段匹配

第一類稱爲MeasuredParams,它有40多個數字字段(高度,重量,腰圍,腕尺寸 - 有些是int,但大多是雙)。第二類是一個稱爲分類器的統計分類器。已經對MeasuredParams字段的子集進行了培訓。分類器已被訓練的字段的名稱按順序存儲在名爲reqdFields的數組中。

我需要做的是加載一個新的數組toClassify,存儲在來自MeasuredParams的字段中的值與reqdFields中的字段列表(包括順序)匹配。我可以對MeasuredParams類進行任何必要的更改,但我堅持使用Classifier。

我的蠻力方法是擺脫MeasuredParams中的字段,並使用arrayList,並將字段名稱存儲在Enum對象中以充當索引指針。然後遍歷reqdFields列表,每次一個元素,並在Enum對象中查找匹配的名稱,以在arrayList中找到正確的位置。將存儲在該位置的值加載到toClassify,然後繼續到reqdFields中的下一個元素。

我不確定我究竟該如何搜索Enum對象 - 如果字段名稱存儲在第二個arrayList中,會更容易。但是,這兩者之間的指數位置必須保持匹配,我又回到使用Enum。我認爲。整個下午我一直在圈子裏奔跑,我一直在想,必須有一個更簡單的方法來做到這一點。我現在只是卡住了,無法看到我已經開始的事情。

任何幫助將非常感激。非常感謝!

邁克爾

回答

3

你可能最好使用地圖,而不是一個列表,你可以使用枚舉爲重點,並獲得價值了。

Map<YourEnumType,ValueType> map = new HashMap<YourEnumType,ValueType>(); 
+2

感謝您聲明映射爲Map而不是HashMap - 沒有足夠的示例代碼鼓勵使用接口!但我會考慮使用EnumMap而不是HashMap來提高效率。 – 2010-04-03 08:31:41

1

@湯姆推薦使用Map是首選的方法。這是一個簡單的例子,它構造了一個用於靜態lookup()方法的Map。每個enum類型有兩個

private enum Season { 

    WINTER, SPRING, SUMMER, FALL; 
    private static Map<String, Season> map = new HashMap<String, Season>(); 
    static { 
     for (Season s : Season.values()) { 
      map.put(s.name(), s); 
     } 
    } 

    public static Season lookup(String name) { 
     return map.get(name); 
    } 
} 

注意隱式聲明靜態methods

public static E[] values(); 
public static E valueOf(String name); 

values()方法返回一個數組,它是非常方便的構建Map。或者,可以直接搜索數組。這些方法是隱含的;它們將在生成時出現在您的enumjavadoc中。

附錄:由於@Bert˚F建議的,一個EnumMap可能是有利的。見Effective Java Second Edition項目33:使用EnumMap的,而不是有序索引,使用EnumMapenum的伴隨一個引人注目的例子。

+1

#1 - 我不明白爲什麼map/lookup()是必須的,因爲正如你指出的那樣,已經有一個valueOf()方法可以做同樣的事情。 lookup()更有效嗎? #2 - 如果lookup()是有用的,它看起來不是線程安全的 - 在映射decl之後立即將init代碼移動到靜態初始化塊中更好。 – 2010-04-03 08:28:21

+0

這兩個權利;這個例子是微不足道的。在實際使用中,只有當O(1)查找的好處超過建設成本時,「Map」纔有意義。大小可以從'EnumSet.allOf(Key.class)'推斷出來。我已經更新了示例以使用靜態初始化程序。 – trashgod 2010-04-03 16:14:51

+0

非常感謝您的快速回復,尤其是示例。按照建議,我將嘗試使用EnumMap。 – Michael 2010-04-05 17:47:46