Java程序在数组列表中查找模式

时间:2016-04-05 02:23:32

标签: java

我创建了一个程序来查找模式。然后让它在括号中打印模式,如“1 3 [5] 4 [5]”但是当数组列表中没有模式时,它会将第一个值声明为模式,如 “[1] 3 4 5”。如果没有模式,我不希望它在第一个整数上显示括号。

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();

4 个答案:

答案 0 :(得分:0)

由于默认情况下函数mode()默认返回数组中的初始元素作为模式,因此无法判断元素是模式还是根本没有模式的情况。因此,当没有模式时,您可以对函数进行轻微更改以返回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;
    }
}

编辑:以下是一个返回真实模式集的函数:

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;
}

答案 1 :(得分:0)

您需要能够返回一个值,表示找不到模式&#39;而不仅仅是第一个值。这里有三个选项(减少优雅):

  1. 如果您使用的是Java 8,则可以返回Optional<Integer>。然后你可以在使用之前明确检查它是否有值。

  2. 您可以返回Integer而不是int,然后使用null表示找不到任何值&#39;。

  3. 使用特殊值,例如0或-1。这就是你目前正在做的事情,但它的缺点是这些数字中的一个很可能是你样本的真实模式。

答案 2 :(得分:0)

boolean bool = true;
        int variable = 0;
        for (int i = 0; i < myIntArray.length; i++) {
            if (myIntArray[i] > 0) {
                if (variable == 0) {
                    variable = myIntArray[i];
                } else if (variable != myIntArray[i]) {
                    bool = false;
                    break;
                }
            }
        }
        if (bool == true) {
            System.out.println("                       ");
            System.out.println("No mode");
        } else {
            ArrayList<Integer> maximum = new ArrayList<Integer>();
            int maxNum = 0;
            for (int i = 0; i < myIntArray.length; i++) {
                if (myIntArray[i] > maxNum) {
                    maxNum = myIntArray[i];
                    maximum = new ArrayList<Integer>();
                    maximum.add(i);
                } else if (myIntArray[i] == maxNum) {
                    maximum.add(i);
                }
            }
            System.out.println("                       ");
            System.out.println("The maximum frequency, or number of occurrences, is " + maxNum + "  times for the number " + maximum);
            System.out.println("The mode is " + maximum);
        }

答案 3 :(得分:0)

当列表中的所有整数都为 0 及以上时使用此算法。如果不是,则使用集合中不可能出现的数字初始化 mode 和 temp。

        public static int getMode(List<Integer> list){
            int mode,freqMode,temp,tempFreq;
            mode=temp=-1;
            freqMode=tempFreq=0;
            Collections.sort(list);
            for(Integer integer:list){
                if(mode == -1){
                    mode = integer;
                    freqMode = 1;
                }else if(mode == integer){
                    freqMode++;
                }else if(temp != integer){
                    temp = integer;
                    tempFreq = 1;
                }else if(tempFreq >= freqMode){
                    mode = integer;
                    freqMode = tempFreq+1;
                    temp = -1;
                    tempFreq = 0;
                }else {
                    tempFreq++;
                }
            }
            return mode;
        }