2016-04-05 3 views
0

Я создал программу для поиска режима. Затем он напечатал режим в скобках, например «1 3 [5] 4 [5]», но когда в списке массивов нет режима, он объявляет первое значение в качестве режима, например «[1] 3 4 5 ". Я не хочу, чтобы он показывал скобки первого целого, если нет режима.Java-программа для поиска в списке массивов

public static int mode(int[] array) { 
    int mode = array[0]; 
    int maxCount = 0; 
    for (int i = 0; i < array.length; i++) { 
     int value = array[i]; 
     int count = 1; 
     for (int j = 0; j < array.length; j++) { 
      if (array[j] == value) 
       count++; 
      if (count > maxCount) { 
       mode = value; 
       maxCount = count; 
      } 
     } 
    } 
    return mode; 
} 

Тогда я печатаю это так:

int[] array = ... 
int mode = mode(array); 
boolean first = true; 
for (int elt : array) { 
    // print separator unless it's the first element 
    if (first) { 
     first = false; 
    } else { 
     System.out.print(' '); 
    } 
    if (elt == mode) { 
     System.out.print(elt); 
    } else { 
     System.out.print('['); 
     System.out.print(elt); 
     System.out.print(']'); 
    } 
} 
System.out.println(); 
+0

Я не думаю, что ваш код производит этот вывод. Повторно проверьте, правильно ли опубликованный код (также проверьте условия 'if'). – Tom

ответ

0

Поскольку ваш режим() функция возвращает по умолчанию начальный элемент массива в качестве режима по умолчанию, вы не можете сказать, элемент является ли или это случай, когда вообще нет режима. Таким образом, вы можете сделать небольшие изменения в функции возвращает 0, когда нет режима вместо этого, то ваш код будет в конечном итоге, как следует:

class TestMode 
{ 
    public static void main (String[] args) throws java.lang.Exception 
    { 
     int[] array = {1,3,2,4,5}; 
     int mode = mode(array); 
     for (int e : array) { 
      if ((mode!=0) && (e==mode)) { 
       System.out.print ("["+e+"]"); 
      } 
      else { 
       System.out.print(e); 
      } 
      System.out.print(" "); 
     } 
    } 

    public static int mode(int[] array) { 
     int mode = array[0]; 
     int maxCount = 0; 
     for (int i = 0; i < array.length; i++) { 
      int value = array[i]; 
      int count = 0; 
      for (int j = 0; j < array.length; j++) { 
       if (array[j] == value) count++; 
       if (count > maxCount) { 
        mode = value; 
        maxCount = count; 
        } 
       } 
     } 
     if (maxCount > 1) { 
      return mode; 
     } 
     return 0; 
    } 
} 

EDIT: Ниже приводится функция, которая возвращает истинное установленный режим:

public static Set<Integer> mode2(List<Integer> list) { 
    int maxFrequency = 0; 
    boolean modeFound = false; 
    Set<Integer> modeSet = new HashSet<>(); 
    Collections.sort(list); 
    for (int i=0; i<list.size(); i++) { 
     int number = list.get(i); 
     int count = 1; 
     for (; (i+count)<list.size() && list.get(i+count)==number; count++) {} 
     i+=(count-1); 
     if (maxFrequency!=0 && count!=maxFrequency) { 
      modeFound = true; 
     } 
     if (count > maxFrequency) { 
      modeSet.clear(); 
      modeSet.add (number); 
      maxFrequency = count; 
     } 
     else if (count == maxFrequency) { 
      modeSet.add(number); 
     } 
    } 
    if (!modeFound) { 
     modeSet.clear(); 
    } 
    return modeSet; 
} 
+0

На самом деле, я нашел ошибку, которая присутствовала в исходной функции. Вам нужно установить count = 0 в строке после «value = array [i]», и именно по этой причине код вел себя так, как вы сказали. Попробуйте запустить его сейчас и посмотрите. Еще один комментарий, смотрящий на определение режима, похоже, что это не будет удовлетворять точному определению режима в любом случае, поскольку набор может иметь более одного режима, когда разные номера имеют одинаковую большую частоту. Например, режим {1,1,3,4,5,2,2} будет {1,2}, так как оба имеют freq = 2; однако {1,1,2,2,3,3} не имеет режима, так как число не имеет частоты, большей любой другой. –

+0

См. Редактирование, которое я сделал, оно возвращает набор чисел, которые являются режимом для списка ввода. –

+0

Извините, но я не могу использовать этот метод, поскольку я должен использовать открытый статический int mode (int [] array) – maria

0

Вы должны иметь возможность вернуть значение, которое означает «не найден режим», а не только первое значение. Вот три варианта (в уменьшении элегантности):

  1. Если вы используете Java 8, то вы могли бы возвращающие Optional<Integer>. Затем вы можете явно проверить, имеет ли значение значение перед его использованием.

  2. Вы можете вернуть Integer вместо int, а затем использовать null, что означает «нет значения».

  3. Используйте специальное значение, например 0 или -1. Это то, что вы делаете в настоящее время, но имеет тот недостаток, что одно из этих чисел вполне может быть истинным способом вашего образца.

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