0

顺便说一下,这是用于 JAVA 编程的。

所以,我正在尝试编写一个方法,它将返回数组中最常见的一个或多个整数。我已经设置了一个完整的类来查找平均值、总和等,但是这个特定的方法有点棘手。到目前为止,我的代码是这样的:

public int[] modeOfData()
{
    List<Integer> modes = new ArrayList<Integer>(  );
    int maxCount=0;
    for (int i = 0; i < data.length; ++i){
        int count = 0;
        for (int j = 0; j < data.length; ++j){
            if (data[j] == data[i]) ++count;
        }
        if (count > maxCount){
            maxCount = count;
            modes.clear();
            modes.add( data[i] );
        } else if ( count == maxCount ){
            modes.add( data[i] );
        }
    }
    return modes.toArray( new Integer[modes.size()] );
}

此代码的返回部分是唯一有语法错误的部分。语法错误为:不兼容的类型。它突出显示括号中的部分。我做错了什么,我必须编辑什么?谢谢!有没有更简单的方法来只用 if-elses 和循环来编码?还是没有清单的方式?再次感谢。

4

2 回答 2

1

将返回类型从更改int[]Integer[]in 方法。

 public Integer[] modeOfData()

方法toArray将返回一个泛型类型数据。类型int[]不是通用的,这就是出现“语法错误:不兼容的类型”的原因。

您应该改用Integer[]使语法错误不显示。

下面是toArray方法 from的源代码List

/**
 * Returns an array containing all of the elements in this list in proper
 * sequence; the runtime type of the returned array is that of the
 * specified array.  Obeys the general contract of the
 * <tt>Collection.toArray(Object[])</tt> method.
 *
 * @param a the array into which the elements of this list are to
 *      be stored, if it is big enough; otherwise, a new array of the
 *      same runtime type is allocated for this purpose.
 * @return  an array containing the elements of this list.
 * 
 * @throws ArrayStoreException if the runtime type of the specified array
 *        is not a supertype of the runtime type of every element in
 *        this list.
 * @throws NullPointerException if the specified array is <tt>null</tt>.
 */
<T> T[] toArray(T[] a);
于 2013-11-15T03:14:37.120 回答
1

OP 写道:
语法错误为:不兼容的类型。它突出显示括号中的部分。我做错了什么,我必须编辑什么?

忽略其他问题和对您的实际算法可能的改进,您的函数被声明为返回一个int[],但List<Integer>.toArray(Integer[])返回一个Integer[],它不是一个int[]

您需要将您的函数声明为返回一个Integer[](对于您的情况可能是最简单的),或者手动创建一个int[]并将Integer项目复制到其中,一次拆箱一个(或者您可以使用Ints.toArray()Guava想),例如

/**
 * Convert collection of Integers to an int array.
 * @param integers Collection of Integers.
 * @return Array of ints, in same order as collection.
 * @throws NullPointerException if integers is null.
 */
static final int[] toIntArray (Collection<Integer> integers) {
    int index = 0, array[] = new int[integers.size()];
    for (Integer integer:integers)
        array[index ++] = integer;
    return array;
}

前一个选项(return 代替)的额外副作用Integer[]是,如果您愿意,您可以使用泛型类型而不是Integer与进行比较.equals()并支持查找具有正确实现的任何对象集合的模式.equals()

OP 写道:
有没有更简单的方法来只用 if-elses 和循环来编码?还是没有清单的方式?

一种选择是使用Map<Integer,Integer>将元素值映射到其计数的 a。在您浏览输入列表并将计数制成表格后,您将拥有一个包含每个元素及其出现次数的地图。您有几个选项(例如,边走边跟踪最大值,或者之后找到它,或者按地图条目的值对列表进行排序)来提取最大计数,我将把它作为练习留给您。

于 2013-11-15T02:46:51.273 回答