2015-01-21 2 views
0

Ответ на этот вопрос уже опубликован на SO, но я хочу найти способ, который не включает сложные структуры данных, такие как hashmaps. Решение должно быть от Интс и football_club [0] .equals (football_club [1])Получение наиболее частого значения из строкового массива

String[] football_club = {"Barcelona", "Real Madrid", "Chelsea", "Real Madrid", "Barcelona", "Barcelona"}; 

//result 
Sting result_club = "a value most in the array" 

большое спасибо.

+6

Хэш-карта - это самый простой способ ... –

+0

Почему вы не хотите использовать хэш-карту? Его нетрудно настроить. – sparkyShorts

+0

они хотят, чтобы я сделал это просто, как могу, поэтому я должен сделать это, как будто они хотят, чтобы я это сделал .. вы можете помочь? – Forbs

ответ

0

Вот решение, использующее нуль функции от java.util пакет, только сырые массивы и петли.

public static void main(String[] args) 
{ 
    String[] football_club = { "Barcelona", "Real Madrid", "Chelsea", "Real Madrid", "Barcelona", "Barcelona" }; 
    boolean[] seen = new boolean[football_club.length]; 
    String result_club = null; 
    int result_count = 0; 
    for (int i = 0; i < football_club.length; i++) { 
     if (!seen[i]) { 
      seen[i] = true; 
      int count = 1; 
      for (int j = i + 1; j < football_club.length; j++) { 
       if (!seen[j]) { 
        if (football_club[i].equals(football_club[j])) { 
         seen[j] = true; 
         count++; 
        } 
       } 
      } 
      if (count > result_count) { 
       result_count = count; 
       result_club = football_club[i]; 
      } 
     } 
    } 
    System.out.println(result_club); 
} 
0

Вот прототип:

import java.util.Arrays; 

public class WordCount 
{ 
    public static void main(String[] args) 
    { 
    String[] football_club = {"Barcelona", "Real Madrid", "Chelsea", "Real Madrid", "Barcelona", "Barcelona"}; 
    // First sort the array to have the same words group togheter 
    Arrays.sort(football_club); 

    String result_club = ""; 
    String word = football_club[0]; 
    int count = 1, winner = 0; // word counters 

    for (int i = 1 ; i < football_club.length; i++) { 
     String current = football_club[i]; 
     if (word.equals(current)) { 
     count++; 
     } 
     else { // word changed 
     if (count > winner) { // save winner 
      winner = count; 
      result_club = word; 
     } 
     word = current; // start new word count 
     count = 1; 
     } 
    } 
    System.out.println("A value most appearing in the array " + result_club + "(" + winner +")"); 
    } 
+0

Люди здесь быстры. – MaxZoom

0

Как все настаивает, вы должны использовать HashMap, но ради этого вопроса, давайте попробуем это (непроверенные):

String mostFrequent = null; 
int frequency = 0; 
Arrays.sort(football_club); // Use a copy if necessary 

int count = 0; 
for(int i = 0; i < football_club.length; i++) { 
    count++; 
    if(i == football_club.length - 1 || !football_club[i].equals(football_club[i + 1])) { 
     if(count > frequency) { 
      mostFrequent = football_club[i]; 
      frequency = count; 
     } 
     count = 0; 
    } 
} 

mostFrequent теперь должен содержать самый частый элемент.

0

Замечания верны в отношении Карт и эффективности, а также его аргументы в пользу того, что просто. В любом случае, вы можете сделать несколько аккуратных трюков и получить свое решение, обратившись только к строковым манипуляциям, без необходимости сортировки или нескольких циклов, например.

public void theMostOftenClub() { 
    String[] football_club = {"Barcelona", "Real Madrid", "Chelsea", "Real Madrid", "Barcelona", "Barcelona"}; 
    String arrayToString = Arrays.toString(football_club); 
    int length = arrayToString.length(); 
    String result_club = ""; 
    int count = 0; 
    for (String club : football_club) { 
     int clubLength = club.length(); 
     int clubCount = (length - arrayToString.replace(club,"").length())/clubLength; 
     if (count < clubCount) { 
      count = clubCount; 
      result_club = club; 
     } 
    } 
    System.out.println(result_club); // prints Barcelona 
} 

Две основные линии

String arrayToString = Arrays.toString(football_club); 

даст вам строку, равную [Barcelona, Real Madrid, Chelsea, Real Madrid, Barcelona, Barcelona]

и

int clubCount = (length - arrayToString.replace(club,"").length())/clubLength; 

даст вам количество каждого слова в сценарии

0

Вы можете использовать Stream API, но она также сводится к использованию карты, хотя вы не видите его:

String result_club = Stream.of(football_club) 
      .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) 
      .entrySet().stream() 
      .max(Comparator.comparingLong(e -> e.getValue())) 
      .map(e -> e.getKey()).orElse(null); 

Что она делает в части:

// group array to a map holding unique strings an its counts within the array 
Map<String, Long> grouped = Stream.of(football_club) 
    .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); 

// find the entry of the map with the maximum count if there is one 
Optional<Entry<String, Long>> max = grouped.entrySet().stream() 
    .max(Comparator.comparingLong(Entry::getValue)); 

// geht the key of the maximum element or a default value if there is none 
String result_club = max.map(Entry::getKey).orElse("Fortuna Düsseldorf"); 
Смежные вопросы