查找数组中的模式

时间:2012-02-22 01:05:18

标签: java

当有多个模式时,是否有人知道如何在数组中找到模式?我有这个代码找到一种模式。但是我正在处理一个具有多个模式的阵列,一个多模式阵列,我必须打印每个模式一次。这是我的代码,有人可以帮助我吗?感谢。

public static int mode(int a[])
{
    int maxValue=0, maxCount=0;

    for (int i = 0; i < a.length; ++i)
    {
        int count = 0;
        for (int j = 0; j < a.length; ++j)
        {
            if (a[j] == a[i]) ++count;
        }

        if (count > maxCount)
        {
            maxCount = count;
            maxValue = a[i];
        }
    }

    return maxCount;
}

public static Integer[] modes(int a[])
{
    List<Integer> modes = new ArrayList<Integer>();
    int maxCount=0;
    for (int i = 0; i < a.length; ++i)
    {
        int count = 0;
        for(int j = 0; j < a.length; ++j)
        {
            if (a[j] == a[i]) ++count;
        }

        if (count > maxCount)
        {
            maxCount = count;
            modes.clear();
            modes.add(a[i]);
        }
        else if (count == maxCount)
        {
            modes.add(a[i]);
        }
    }
    return modes.toArray(new Integer[modes.size()]);
}

5 个答案:

答案 0 :(得分:3)

由于元素介于10和1000之间,因此可以使用Counter数组。在此Counter数组中,您可以存储a [i]元素的值的计数。我想你可以在代码中更好地理解这一点:

public static List<Integer> mode(int[] a) {
    List<Integer> lstMode = new ArrayList<Integer>();
    final int MAX_RANGE = 1001;
    int[] counterArray = new int[MAX_RANGE]; //can be improved with some maths :)!
    //setting the counts for the counter array.
    for (int x : a) {
        counterArray[x]++;
    }
    //finding the max value (mode).
    int maxCount = counterArray[0];
    for(int i = 0; i < MAX_RANGE; i++) {
        if (maxCount < counterArray[i]) {
            maxCount = counterArray[i];
        }
    }
    //getting all the max values
    for(int i = 0; i < MAX_RANGE; i++) {
        if (maxCount == counterArray[i]) {
            lstMode.add(new Integer(i));
        }
    }
    return lstMode;
}

如果您的输入的元素超出1000,您可以查找地图答案(与其他帖子一样)。

答案 1 :(得分:2)

我们应该以简单的方式执行此操作,并使用以下格式的Map数据结构:

Map<Integer,Integer>  

然后保持运行总计,然后迭代键集并从地图中拉出最高值。

如果您想继续使用List实现,可以执行以下操作以删除欺骗:

Set s = new HashSet(list);  
list = new ArrayList(s);

答案 2 :(得分:1)

一种方法是(大约)运行(大约)当前代码两次:第一次,找到maxCount,第二次,打印出发生的每个值maxCount倍。 (您需要进行一些修改才能打印每个模式一次,而不是打印maxCount次。)

答案 3 :(得分:1)

不是使用单个maxValue,而是将模式存储在ArrayList<Integer>

if (count == maxCount)
{
    modes.add(a[i]);
}
else if (count > maxCount)
{
    modes.clear(); // discard all the old modes
    modes.add(a[i]);
    maxCount = count;
}

j = i代替j = 0开始。

答案 4 :(得分:0)

由于数组值的范围仅为[10,1000],因此您可以使用Map<Integer,Integer>存储每个已发现的数组值(映射键)与其计数(映射值)之间的映射。 HashMap在这里会很好用。

增加点数:

int count = (map.contains(a[i]) ? map.get(a[i]) : 1;
map.put(a[i],count);

继续跟踪你已经做过的最大数量,最后,只需迭代地图并收集地图值等于最大数量的所有地图关键字。