2015-09-19 188 views
0

我遇到了數組的問題。也許我用奇怪的方式來解決這個問題,你們讓我知道。我有兩個陣列:將下標從一個陣列匹配到另一個陣列

String[] months = {"January","February","March","April","May", 
        "June","July","August","September", 
        "October","November","December"}; 
double[] rainfall ={4.22, 3.18, 3.03, 3.52, 4.54, 5.55, 
        4.71, 4.35, 5.26, 5.46, 4.78, 4.09}; 

這些數字代表降雨量。我運行該算法以從double[]降雨量中找到最大和最小值,並且它給了我3.03,這是行軍。 我的問題是,我如何將下標與數組String[]個月中的下標關聯起來,以便它也顯示月份的名稱? 我應該做一個堆疊數組嗎?

+1

您使用的是哪種語言? – Elipzer

+0

在高層,這個想法應該是,根據降雨量的輸出值的指數,從「月份」數組中獲得數值。一旦您回覆該語言,我們將能夠提供可能的解決方案。 –

+0

對不起,我忘了提及它。它的JAVA –

回答

-1

很簡單的解決方法是尋找你smallVal和BIGVAL的索引。

for(int i = 0; i<rainfall.size(); i++){ 
    if(maxRain == rainFall[i]) 
     maxIndex = i; 
    if(minRain == rainFall[i]) 
     minIndex = i; 

} 

smallMonth = months[minIndex]; 
bigMonth = months[maxIndex]; 
+0

它一直是O(n)。此外,該算法是錯誤的。 – async

+0

算法沒有錯。他在這個問題中說,給出數組中的最大值和最小值,他希望找到它們的索引。 – faraza

1

我建議改變你的數據結構圖:

Map<String, Double> rainfallMap = new TreeMap<>(); 
rainfallMap.put("January", 4.22); 
rainfallMap.put("February", 3.18); 
rainfallMap.put("March", 3.03); 
rainfallMap.put("April", 3.52); 
rainfallMap.put("May", 4.54); 
rainfallMap.put("June", 5.55); 
rainfallMap.put("July", 4.71); 
rainfallMap.put("August", 4.35); 
rainfallMap.put("September", 5.26); 
rainfallMap.put("October", 5.46); 
rainfallMap.put("November", 4.78); 
rainfallMap.put("December", 4.09); 

現在你可以做到這一點(的Java 8):

Entry<String, Double> minEntry = rainfallMap.entrySet().stream() 
    .min((e1, e2) -> Double.compare(e1.getValue(), e2.getValue())) 
    .get(); 

System.out.println(String.format("Minimal rainfall was %.2f in %s", 
    minEntry.getValue(), minEntry.getKey())); 

編輯:

@Tagir Valeev建議更好地檢索最小條目:

Entry<String, Double> minEntry = 
    Collections.min(rainfallMap.entrySet(), Map.Entry.comparingByValue()); 

我都比較接近與江鈴控股有限公司和@Tagir Valeev的建議肯定更好是:

Benchmark       Mode Cnt Score Error Units 
Rainfall.getMinRaifallCollections avgt 5 73.654 ± 3.768 ns/op 
Rainfall.getMinRainfallStreams  avgt 5 126.808 ± 10.559 ns/op 
+1

好的答案,但我建議使用LinkedHashMap或TreeMap,以便迭代順序始終相同。如果兩個條目具有相同的值,則在多次運行此代碼時,正常(未定義順序)的HashMap可能會產生不同的答案。 – dbort

+0

這裏您不需要Stream API。使用簡單的'Entry minEntry = Collections.min(rainfallMap.entrySet(),Map.Entry.comparingByValue())'會以更短更有效的方式產生相同的結果。如果問題*可以通過流api解決,除非OP明確要求這樣的解決方案,否則您不應該在問題中添加[tag:java-stream]標記。如果我們將所有這些APIs /庫(Apache常見的,番石榴等)添加到標籤中,就可以解決它了? –

+0

@TagirValeev,你是對的,我更新了我的答案。 – luboskrnac

0

那麼,你需要一個線性搜索來獲得第二個數組中的最小值。找到最低值時,保存其索引。您將使用索引查找相應的月份:

int minIndex = 0; 

for(int i = 1; i < rainfall.length; i++) 
{ 
    if(rainfall[i] < rainfall[minIndex]) 
    { 
     minIndex = i; 
    } 
} 

string month = months[minIndex];