计算List <integer> </integer>中的数字出现次数

时间:2013-11-20 20:40:02

标签: java list count

我正在创建一个小型应用程序来计算学生的成绩。方法中需要两个List<Integer>

例如,如果我的list包含8个项目; {52,62,65,65,72,72,75,75}我想找到一种方法来计算list并查找同一个十分之内的项目(例如; 30,40,50,60,70)。所以在这种情况下,4个项目将在70年代内,然后能够存储它(称为上边界)。这样做的目的是,如果4个项目位于上边界,则整体学生成绩将更高。

我的问题是,我怎么能做到这一点?我已经看到我可以使用某种map,但我不确定这是否是实现它的最佳方式。

3 个答案:

答案 0 :(得分:2)

  

迭代您的列表并将条目放入Map   其中key是数字,value是计数。

使用一点psuedocode扩展此前一个答案...

Map<Integer, Integer> gradeMap = new HashMap<Integer, Integer>();
int roundedGrade = (grade / 10) * 10;
// Where "incrementMap" is a function you define...
// The purpose of the method is to increment the value (counter) in the map for a particular key
// If the key doesn't exist yet, you want to add it with an initial count of "1"
// Jérémy Dutheil's answer is a good example of this method, but I can include the actual ones that I use since it is a generic library method (see below)
incrementMap(gradeMap, roundedGrade);

// To find upper boundary
int upperBoundary = 0;
for(Map.entry<Integer,Integer> entry : gradeMaps.getEntries())
{
  int count = entry.getValue();
  int tenth = entry.getKey();
  // determine if this is the upper boundary
}

这是incrementMap的示例实现:

public static <T> void incrementMap(Map<T, Integer> map, T key)
{
    incrementMap(map, key, 1);
}

public static <T> void incrementMap(Map<T, Integer> map, T key, int amountToIncrement)
{
    assert map != null;
    int currentValue = map.containsKey(key) ? map.get(key) : 0;
    map.put(key, currentValue + amountToIncrement);
}

我可能会把我们拉到正切...我包含泛型的唯一原因是因为我想给你实际的代码,我觉得在我的库中有用,而不仅仅是假代码。如果你想让这个更容易理解,用“整数”替换每个出现的“T”。这样做的目的是允许您对具有任何类型“键”的Map使用相同的方法,只要“值”是Integer类型。它不一定是“T”,这只是大多数教程中的例子。 (例如:http://www.javacodegeeks.com/2011/04/java-generics-quick-tutorial.html

例如,请查看此实用程序方法,该方法使用两种不同的泛型类型:

/**
 * Convenience method to create a map containing a single entry.
 * @param pKey the entry key
 * @param pValue the entry value
 * @param <K> the key type
 * @param <V> the value type
 * @return a map with a single entry
 */
public static <K, V> Map<K, V> mapOfOne(K pKey, V pValue)
{
    Map<K, V> target = new HashMap<K, V>();
    target.put(pKey, pValue);
    return target;
}

答案 1 :(得分:1)

迭代您的列表并将条目放入Map<Integer, Integer>,其中key是数字,值是计数。

答案 2 :(得分:0)

我刚才意识到,事实上,没有一个回答的人从来没有真正理解你的问题;它不只是计算出现次数,而是找到出现的第十个'然后计算每十分之一的数字。

首先,我们需要一个函数来确定给定整数的第十个

int getTenth( int number ) {
    return Math.floor( number / 10 );
}

这里我们简单地将数字除以10(因为在你的例子中只给出数字&lt; 100),然后我们将其舍入为最接近的整数。

然后,您必须存储列表中每个十分之一的计数;为此,我们将使用Map来存储列表以及相关的(有关详细信息,请参阅the documentation在你的问题中,我们将第十个用作键,将计数用作值。

function Map< Integer, Integer > getTenthCount( List< Integer > list ) {
    Map< Integer, Integer> tenthCount = new HashMap< Integer, Integer >();

    for( Integer i : list ) {
        int tenth = getTenth( i );
        if( !tenthCount.containsKey( tenth ) ) {
            tenthCount.put( tenth, 1 );
        } else {
            // Value exists, add to count
            int count = tenthCount.get( tenth );
            count++;
            tenthCount.put( tenth, count );
        }
    }

    return tenthCount;
}

然后,您可以轻松地使用这两个函数来解析列表中的值并使用它。