2015-09-19 2 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}; 

Эти цифры представляют собой осадки. Я запускаю алгоритм, чтобы найти Максимальное и Наибольшее количество осадков, и это дает мне номер 3.03, который является маршем. Мой вопрос: как я могу соотнести этот индекс с тем из массива String[] месяцев, чтобы он показывал мне название месяца? Должен ли я сделать сложный массив?

+1

Какой язык вы используете? – Elipzer

+0

В highlevel идея должна быть, получить значение из массива «месяцев» на основе индекса выходного значения в осадках. Как только вы ответите языком, мы сможем предоставить возможное решение. –

+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

Алгоритм не ошибается. Он говорит в вопросе о том, что, учитывая максимальное значение и значение min в массиве, он хочет найти свой индекс. – 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())); 

EDIT:

@Tagir Валеев предложил лучший поиск минимального значения:

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

я сравнил и сблизился с JMH и предложение @Tagir Валеева определенно лучше:

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()) приведет к тому же результату более коротким и более эффективным способом. Также вам не следует добавлять тег [tag: java-stream] к вопросу, если проблема * может быть решена через stream api, если OP явно не задал такое решение. Его можно решить, используя множество других API/библиотек (Apache commons, Guava и т. Д.), Мы должны добавить их все в теги? –

+0

@ Тагир Валеев, вы правы, я обновил свой ответ. – luboskrnac

0

Ну, вам понадобится линейный поиск, чтобы получить наименьшее значение во втором массиве. Когда вы найдете самое низкое значение, сохраните его индекс. Вы будете использовать индекс, чтобы найти соответствующий месяц:

int minIndex = 0; 

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

string month = months[minIndex]; 
Смежные вопросы