本文目录导读:

这个问题问得挺有意思,“凌空抽射”不是Java里的标准API或库函数,它更像是一个业务逻辑或游戏逻辑(比如足球游戏FIFA、实况足球,或者是某种数据分析场景)中的事件。
“统计凌空抽射次数多不多”在Java中,核心是先得有数据,然后才能谈统计。
我分几个场景来帮你拆解,并给出对应的Java代码案例:
你有一份历史比赛数据(CSV/JSON),想统计频率
假设你的数据里有每场比赛的射门事件记录,我们写一个通用的统计逻辑。
数据模型(射门事件)
// 定义一个射门事件类
public class ShotEvent {
private String playerName;
private String shotType; // "VOLLEY" (凌空), "HEADER" (头球), "NORMAL" (普通)
private int minute;
// 省略构造函数和getter/setter
}
统计逻辑(主程序)
import java.util.*;
public class VolleyStatistic {
public static void main(String[] args) {
// 模拟获取到的历史数据
List<ShotEvent> allShots = Arrays.asList(
new ShotEvent("张三", "VOLET", 10),
new ShotEvent("李四", "NORMAL", 25),
new ShotEvent("王五", "VOLET", 80),
// ... 很多其他数据
new ShotEvent("赵六", "HEADER", 90)
);
// 1. 统计总射门数
int totalShots = allShots.size();
// 2. 统计凌空抽射的次数
long volleyCount = allShots.stream()
.filter(e -> "VOLET".equals(e.getShotType()))
.count();
// 3. 计算占比
double percentage = (totalShots > 0) ? (volleyCount * 100.0 / totalShots) : 0.0;
// 4. 判断“多不多”(定义一个业务阈值,比如超过15%就算多)
boolean isFrequent = percentage > 15.0;
// 输出结果
System.out.println("总射门次数: " + totalShots);
System.out.println("凌空抽射次数: " + volleyCount);
System.out.printf("凌空抽射占比: %.2f%%%n", percentage);
System.out.println("凌空抽射是否频繁 (超过15%)? " + isFrequent);
}
}
这个案例告诉你,“多不多”取决于你设定的阈值(比如15%),如果占比超过阈值,程序就会告诉你“多”。
你在开发一个足球游戏(实时统计)
如果是在打比赛,你需要一个计数器和事件监听器。
public class MatchStatistics {
private int totalShots = 0;
private int volleyShots = 0;
// 当球员射门时调用这个方法 (事件驱动)
public void onShotOccurred(String shotType) {
totalShots++;
if ("VOLLEY".equalsIgnoreCase(shotType)) {
volleyShots++;
}
// 实时打印或更新UI
System.out.println("[实时统计] 当前凌空抽射: " + volleyShots + " / " + totalShots);
}
// 判断是否“经常”使用凌空 (例如下半场超过10次)
public boolean isVolleyOverused() {
return volleyShots > 10;
}
}
你在做数据分析(大数据量,比如几百万条)
如果数据量很大,直接 stream() 可能太慢,可以先分组再统计。
import java.util.Map;
import java.util.stream.Collectors;
// 一次性统计所有射门类型的分布
Map<String, Long> shotTypeCount = allShots.stream()
.collect(Collectors.groupingBy(ShotEvent::getShotType, Collectors.counting()));
long volleys = shotTypeCount.getOrDefault("VOLLEY", 0L);
long total = shotTypeCount.values().stream().mapToLong(Long::longValue).sum();
怎么回答“多不多”?
Java代码只能帮你算“有多少”,至于“多不多”,需要你定义业务规则:
- 相对占比法:凌空抽射次数 / 总射门次数,超过一定比例(如20%)算多。
- 绝对数值法:在一场90分钟的比赛中,凌空抽射超过了5次,算多。
- 对比法:与对手的凌空抽射次数相比,如果比对手多,算多。
如果你能提供具体的“数据来源”(比如日志文件格式、数据库表字段),我可以帮你写一个更精确的、可运行的Java代码来解析并统计。