当有多个模式时,是否有人知道如何在数组中找到模式?我有这个代码找到一种模式。但是我正在处理一个具有多个模式的阵列,一个多模式阵列,我必须打印每个模式一次。这是我的代码,有人可以帮助我吗?感谢。
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()]);
}
答案 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);
继续跟踪你已经做过的最大数量,最后,只需迭代地图并收集地图值等于最大数量的所有地图关键字。