2016-01-22 3 views
1

Мне нужно создать Java-программу, которая принимает строковый массив стран и выводит название стран и сколько раз они находятся в массиве.Java-массив из стран

Пример:

String[] countries = {"Mexico","Russia","USA","Russia","Mexico", 
         "USA","Germany", "Mexico", "Canada" }; 

Мне нужен выход, чтобы быть:

Mexico 3 
Russia 2 
USA 2 
Germany 1 
Canada 1 

Вот что я до сих пор:

public class TestingTwo { 

public static void main (String args[]) { 

    String[] countries = {"Mexico","Russia","USA", "Russia","Mexico", "USA","Germany", "Mexico", "Canada" }; 
    int i; 
    int j; 


    for(i=0;i<countries.length-1;i++) { 
     int count=0; 

     for(j=i+1;j<countries.length;j++) { 
      if ((countries[i]==countries[j]) && (i != j)) { 
       count++; 
       System.out.println(countries[j]+ " " + count); 
      } 
     } 
    } 
    }//end of main method 
}//end of class 

Выход им получаю:

Mexico 1 
Mexico 2 
Russia 1 
USA 1 
Mexico 1 

Проблема возникла: У меня возникли проблемы с поиском способа распечатать название страны только один раз. Я могу получить его там, где он печатает страны, у которых есть дубликаты, но он печатает его несколько раз. У меня также есть проблемы с int count и как правильно калибровать количество дубликатов.

+0

Есть ли у вас конкретная проблема? – Coderchu

+0

Да, им не удалось найти способ распечатать имя страны один раз. Я могу получить его там, где он печатает страны, у которых есть дубликаты, но он печатает его несколько раз. У меня также есть проблемы с int count и как правильно калибровать количество дубликатов. –

+0

Я бы предложил создать двухмерный массив, один столбец с именем страны другим с подсчетом. когда вы перебираете свой вход, сначала проверьте, существует ли название страны, если да добавьте 1 к счету, иначе добавьте его в массив. Затем просто распечатайте этот массив, когда закончите. – Coderchu

ответ

0

Если это возможно для вас, чтобы использовать Java 8, то я думаю, что принятый ответ на этот другой вопрос принесет пользу вам:

Group by counting in Java8 stream API

Применяя его к вашей проблеме мы могли бы решить эту проблему следующим образом:

import java.util.Map; 
import java.util.function.Function; 
import java.util.stream.Collectors; 
import java.util.Arrays; 

public class TestingTwo{ 
    public static void main (String[] args){ 
     String[] countries = {"Mexico","Russia","USA","Russia","Mexico", 
         "USA","Germany", "Mexico", "Canada" }; 

     Map<String, Long> counted = Arrays.stream(countries) 
      .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); 

     for(String country: counted.keySet()){ 
      System.out.println(country+" "+counted.get(country)); 
     } 
    } 
} 
+0

Это не дает ответа на вопрос. Чтобы критиковать или запросить разъяснения у автора, оставьте комментарий ниже своего сообщения - вы всегда можете прокомментировать свои собственные сообщения, и как только у вас будет достаточно [репутации] (http://stackoverflow.com/help/whats-reputation), вы будете быть в состоянии [прокомментировать любое сообщение] (http://stackoverflow.com/help/privileges/comment). - [Из обзора] (/ review/low-quality-posts/10985182) – user1140237

+0

@ user1140237 Будет ли это подходящим ответом? Я все еще чувствую это. –

+0

@ AndréRamos Это не неподходящий ответ, но было бы намного лучше ответить, если бы вы объяснили * почему * это ответ и как работают некоторые из более продвинутых бит. В частности, искатель кажется довольно новым программистом (Java), поэтому, вероятно, все, что от «Map ... to..keySet()», вероятно, невероятно новое и запутанное.Также добавление pre-Java8 для сравнения и те, у кого нет 8, все равно не пойдет наперекосяк. –

3

Попробуйте

String[] countries = {"Mexico","Russia","USA","Russia","Mexico", 
      "USA","Germany", "Mexico", "Canada" }; 
    Map<String, Integer> map = new LinkedHashMap<>(); 
    for (String country : countries) { 
     map.compute(country, (k, v) -> v == null ? 1 : v + 1); 
    } 
    for (Map.Entry<String, Integer> e : map.entrySet()) { 
     System.out.println(e.getKey() + " " + e.getValue()); 
    } 
0

Если вы не используя Java 8, то вы можете попробовать следующий код:

Set<String> uniqueCountries = new HashSet<String>(Arrays.asList(countries)); 

Iterator iterator = newset.iterator(); 
while (iterator.hasNext()){ 
    int count = 0; 
    String c = iterator.next(); 
    for(int i=0;i<countries.length;i++) { 
    if(c.equals(countries[i])) { 
     count++; 
    } 
    } 
    System.out.println(countries[i]+ " " + count); 
} 

Тем не менее этот код не оптимизирован, поскольку для каждой уникальной страны мы обходом массива ввода.

Смежные вопросы