2013-05-07 48 views
0

我有一個Map將舉行一個,並且只有一個Entry。我知道這是肯定的,因爲它擁有執行這樣的查詢結果:如何優雅地從一個地圖得到唯一的元素

SELECT MAX(COLUMN) FROM SOMETABLE 

在最壞的情況下,它應該返回null。 現在我試圖得到這個結果。我面臨兩種方法,但我認爲應該有更好的解決方案。

我的測試代碼:

HashMap<String, Object> result = new HashMap<String, Object>(); 
result.put("maxColumn", new Integer(1)); 

解決方案1:

Integer maxValue = (Integer) result.get(result.keySet().iterator().next()); 

解決方案2:

Integer maxValue = (Integer) result.values().toArray()[0]; 

有沒有更好的方式來做到這一點?哪一個你覺得更多的聲明/更便宜?

編輯:我不允許使用任何其他數據結構,因爲Map<String, Object>是從我使用的持久性API返回的結果類型。

+2

地圖是項目的集合。如果只有(最多)1條記錄,爲什麼要使用這個? – splungebob 2013-05-07 20:06:18

+3

@splungebob我猜這是他使用的任何SQL庫的API的一部分(我認爲這是SQL給予他的查詢)。 – ajp15243 2013-05-07 20:09:06

+3

http://codereview.stackexchange.com/ – 2013-05-07 20:10:26

回答

2

最簡單和乾淨是選項2,因爲這將直接進入價值(不通過get()):

Integer i = (Integer) result.values().toArray()[0]; 

但它是一個有點難看,有一個演員。我會傾向於重構爲您的整個團隊可以使用一個類型的實用方法是:

public class MapUtils { 

    public static <T> T getSingleValue(Map<String, Object> map) { 
     return (T) map.values().toArray()[0]; 
    } 
} 

通過鍵入的方法,可以避免在代碼中醜陋的演員,因爲你會使用這樣的:

Integer maxValue = MapUtils.getSingleValue(result); 

這裏Java可以使用類型推斷來確定你期望。通過沒有演員表,您可以更改maxValue的類型,代碼仍然可以工作。通過演員陣容,你必須改變類型

+0

我想你的意思是'整數maxValue = MapUtils.getSingleValue(result)'。對不起,但我沒有看到類型推理在這種情況下如何工作,即使在閱讀[this](http://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html)之後。沒有一個參數的類型爲T.我不應該通過指定類型參數來調用此方法,如'Integer maxValue = MapUtils。 getSingleValue(result)'? (我承認我沒有測試它尚未) – DiegoAlfonso 2013-05-07 22:22:31

+0

*您可以通過*指定類型調用它,但你不必在某些情況下,當返回值分配給一個變量,例如,這裏的java自己看着辦出T的類型是Integer。而且,你們的意思是MapUtils(我改變了名字,如果實用類的時候我意識到它比你的用法更普遍適用。 – Bohemian 2013-05-08 00:02:35

1

如果你是絕對肯定有一個且只有一個元素:

Integer maxValue = map.values().iterator().next() 

List<Integer> integerList = new ArrayList<Integer>(map.values()); 
Integer maxValue = integerList.get(0); 

for (Integer maxValue : map.values) { 
    doStuffWithMaxValue(maxValue);   
} 

鑄造是不是一個好主意。

+0

我使用的方法的返回類型是ArrayList 而不是ArrayList ,所以我看不到實現避免投射的解決方案的方式。對不起,我的問題不夠清楚,跳過了那些重要的細節。 – DiegoAlfonso 2013-05-07 21:01:43

+0

關於你的第二個建議,它不會工作,因爲'map.values()'返回一個'Collection',並且沒有'ArrayList (Collection)' – DiegoAlfonso 2013-05-07 21:05:21

+0

@DiegoAlfonso的構造函數實際上有:http:// docs。 oracle.com/javase/6/docs/api/java/util/ArrayList.html – m3th0dman 2013-05-08 06:35:27

相關問題