创建一个通用方法,以在对象列表中查找特定属性的最大值

时间:2016-12-13 13:41:33

标签: java generics groovy java-8

我正在使用Groovy / Java创建一个小型项目来跟踪足球运动员统计数据。我有一个方法迭代一个Player对象列表,找到谁得分最多的目标并保持最干净的工作表。目前这些方法使用相同的代码,我试图制作一个通用方法,但无法看到如何做到这一点,因为我想要找到的每个属性的最大值将是不同的,例如目标和干净的工作表。任何人都可以给我一些指示,我是泛型的新手,我试图传入一个通用对象,但后来无法解决如何定位该对象上的特定属性来计算循环中的最高值。 / p>

这是我的代码

https://gist.github.com/anonymous/0751dc3eae8f264e12ea4564f0e71dd2

@Override
Promise<Map<String, Double>> findPlayerWithMostMotms(List<Player> players) {
    Map<String, Integer> mostManOfTheMatches = [:]
    Integer currentlyMostManOfTheMatches = 0
    returnPlayerWithHighestAverageRating(
        players, mostManOfTheMatches, currentlyMostManOfTheMatches
    )
    return Promise.value(mostManOfTheMatches)
}

private
static List<Player> returnPlayerWithHighestAverageRating(List<Player> players, 
    Map<String, Integer> mostManOfTheMatches, Integer currentlyMostManOfTheMatches) {
    players.each {
        if (it.manOfTheMatches > currentlyMostManOfTheMatches) {
            mostManOfTheMatches.clear()
            mostManOfTheMatches.put(it.name, it.manOfTheMatches)
        }
    }
}

@Override
Promise<Map<String, Integer>> findMostCleanSheets(List<Player> players) {
    Map<String, Integer> mostCleanSheets = [:]
    Integer CurrentHighestValue = 0
    returnPlayerWithMostCleanSheets(players, mostCleanSheets, CurrentHighestValue)
    return Promise.value(mostCleanSheets)
}

private
static List<Player> returnPlayerWithMostCleanSheets(List<Player> players, 
    Map<String, Integer> mostCleanSheets, Integer CurrentHighestValue) {
    players.each {
        if (it.cleanSheets > CurrentHighestValue) {
            mostCleanSheets.clear()
            mostCleanSheets.put(it.name, it.cleanSheets)
        }
    }
}

2 个答案:

答案 0 :(得分:2)

您可以去年在德国斯图加特举行的Java论坛上了解这个presentation

只有少数幻灯片使用德语,99%的内容是&#34;基于英语&#34; Java源代码;像

collection .sort(
  Comparator
    .comparing(Person::getName)
    .thenComparing(Person::getId)
);

其中&#34;比较器&#34;是一个实现您正在寻找的实现的示例实现 - 允许调用&#34;选择器&#34;某些&#34;数据&#34;上的方法(例如getName());类。

如果您使用的是java8,那么您可以找到很多材料来帮助您入门。

答案 1 :(得分:0)

我结束了这样做,我确信这是一个更好的方法来实现它。

      @Override
Promise<Map<String, ?>> findObjectwithLargestSpecificProperty(List<?> objects, String key, String propertyName) {
    Map<String, ?> highestKeyValuePair = [:]
    Integer currentHighestValue = 0
    returnObjectWithLargestSpecificPropertyValue(objects, highestKeyValuePair, currentHighestValue, key, propertyName)
    return Promise.value(highestKeyValuePair)
}


private
static List<?> returnObjectWithLargestSpecificPropertyValue(List<?> objects, Map<String, ?> highestKeyValuePair, Integer currentHighestValue, String key, String propertyName) {
    objects.each {
        if (it."${propertyName}" > currentHighestValue) {
            highestKeyValuePair.clear()
            highestKeyValuePair.put(it."${key}", it."${propertyName}")
        }
    }

}

我最终将属性名称和我正在寻找的密钥名称传递给方法。