我创建了一个程序来查找模式。然后让它在括号中打印模式,如“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();
答案 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;而不仅仅是第一个值。这里有三个选项(减少优雅):
如果您使用的是Java 8,则可以返回Optional<Integer>
。然后你可以在使用之前明确检查它是否有值。
您可以返回Integer
而不是int
,然后使用null
表示找不到任何值&#39;。
使用特殊值,例如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;
}