2015-09-19 178 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];