我正在创建一个小型应用程序来计算学生的成绩。方法中需要两个List<Integer>
。
例如,如果我的list
包含8个项目; {52,62,65,65,72,72,75,75}
我想找到一种方法来计算list
并查找同一个十分之内的项目(例如; 30,40,50,60,70)。所以在这种情况下,4个项目将在70年代内,然后能够存储它(称为上边界)。这样做的目的是,如果4个项目位于上边界,则整体学生成绩将更高。
我的问题是,我怎么能做到这一点?我已经看到我可以使用某种map
,但我不确定这是否是实现它的最佳方式。
答案 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;
}
然后,您可以轻松地使用这两个函数来解析列表中的值并使用它。