我发现在使用 java 集合时,尤其是在使用泛型编写实用程序方法时,我的代码通常是丑陋和臃肿的,充满了空检查、嵌套循环和重复。专注于这个例子,我想要改进的想法。
假设我们有一个EnumMap
其值是评级列表。例如,假设enum
s 本身代表水果,每个值代表不同人给出的列表评级。
APPLE -> [1, 3, 4]
ORANGE -> [2, 0, 5]
John rated apple 1, Mary rated apple 3, Steve rated apple 4
John rated orange 2, Mary rated orange 0, Steve rated orange 5
Note the specific names are irrelevant and provided only to clarify the setup
现在我们要编写一个实用方法,该方法接受与上述类似的数据结构,并返回每个人最喜欢的水果的列表。因此,上述样本数据的预期结果将是:[ORANGE, APPLE, ORANGE
因为2 > 1
、3 > 0
和5 > 4
。
以下是我目前执行此操作的方法。我想要一种同样(或更高)有效但更简洁的方式来编写相同的算法。
谢谢!
public class MyListUtil {
public static <K extends Enum<K>, T extends Object & Comparable<? super T>> List<K> maxKeysByIndex(EnumMap<K, List<T>> enumMap) {
Iterator<K> keysIter = enumMap.keySet().iterator();
int sizeOfAllLists = enumMap.get(keysIter.next()).size();
List<K> ret = new ArrayList<K>();
for (int i=0; i<sizeOfAllLists; i++) {
keysIter = enumMap.keySet().iterator();
K maxIndexKey = null;
T maxIndexVal = null;
while (keysIter.hasNext()){
K curKey = keysIter.next();
T curVal = enumMap.get(curKey).get(i);
if (maxIndexVal == null || curVal.compareTo(maxIndexVal) > 0) {
maxIndexVal = curVal;
maxIndexKey = curKey;
}
}
ret.add(maxIndexKey);
}
return ret;
}
}