2016-02-18 5 views
-3

Имея список, который может содержать неопределенное число «A», «B», «C» или «D», я должен вычислить среднюю букву в списке.Эффективный способ получить среднюю строку в списке

Например, имея [A, C] в среднем составляет B.

Это мой подход:

public static String calculateAverage(final List<String> letters) { 

    int numberOfA = 0; 
    int numberOfB = 0; 
    int numberOfC = 0; 
    int numberOfD = 0; 
    for (String letter : letters) { 
     if (letter.equalsIgnoreCase("A")) { 
      numberOfA++; 
     } 
     if (letter.equalsIgnoreCase("B")) { 
      numberOfB++; 
     } 
     if (letter.equalsIgnoreCase("C")) { 
      numberOfC++; 
     } 
     numberOfD++; 
    } 

    int average = 
     (numberOfA * 1 + numberOfB * 2 
      + numberOfC * 3 + numberOfD * 4) 
      /letters.size(); 

    if (average>=1 && average<2) return "A"; 
    if (average>=2 && average<3) return "B"; 
    if (average>=3 && average<4) return "C"; 
    return "D"; 
} 

Есть ли более эффективный способ сделать это?

+5

Что такое средняя буква? если список содержит '[A, C]' является ответом 'B' или undefined? – Ferrybig

+0

Ответ: B. – anonymous

+0

'[A, D]' также 'B', но это то, что вы хотите? – cozyconemotel

ответ

2

Если они являются одиночными символами, просто просуммировать их и разделить на число:

char averageCharacter(List<String> cs) { 
    int sum = 0; 
    for (String c : cs) { 
    sum += c.charAt(0); 
    } 
    return (char) (sum/cs.size()); // Potentially with different rounding. 
} 

Вы можете округлить целочисленное деление по-разному:

  • покрытие просто sum/cs.size()
  • Ceil is (sum + cs.size() - 1)/cs.size()
  • Круглый: (sum + cs.size()/2)/cs.size()
0

Во-первых: У вас есть код ошибки: numberOfD++; всегда вызывается, потому что вы не используете пункт if.

Мой подход был бы (не писать, это выглядит как домашнее задание, вы должны сделать себя):

Присвоить Int для AD (позволяет сказать, что 65-68, что бы их голец значение) ...

  • Loop через строки, добавьте значение текущего символа счетчика
  • После этого разделить счетчик на количество символов в строке
  • Результат будет значение ASCII из «насчитайте» персонажа, который вы можете голец.
0

Предполагая, что вы подтвердили свой вклад (т.е. все записи в списке действительное письмо 1-символов):

int count = 0; 
int total; 
for(String s : letters) { 
    total += (int) s.charAt(0); 
    count++; 
} 

int average = total/count; //Watch out here, this is integer division. 

//convert back to char: 
return (char) average; 
+1

Вставить в 'int' не нужно, а также' count' действительно. –

0

Во-первых, ваш код неверен. Вы увеличиваете numberOfD каждый раз, независимо от того, что это за письмо. По крайней мере, сделать эту поправку:

 for (String letter : letters) { 
     if (letter.equalsIgnoreCase("A")) { 
      numberOfA++; 
     } else if (letter.equalsIgnoreCase("B")) { 
      numberOfB++; 
     } else if (letter.equalsIgnoreCase("C")) { 
      numberOfC++; 
     } else 
      numberOfD++; 
    } 

Как насчет усреднения значений Юникода:

char[] letters = {'A','B','C','D'}; 
    int sum = 0; 
    for (char c : letters) { 
     sum += (int)c; 
    } 
    System.out.println((char)(sum/letters.length)); 
Смежные вопросы