gpt4 book ai didi

java - 我的方法太具体了。我怎样才能使它更通用?

转载 作者:行者123 更新时间:2023-12-04 06:52:48 24 4
gpt4 key购买 nike

我有一个类,大纲基本上列在下面。

import org.apache.commons.math.stat.Frequency;
public class WebUsageLog {
private Collection<LogLine> logLines;
private Collection<Date> dates;

WebUsageLog() {
this.logLines = new ArrayList<LogLine>();
this.dates = new ArrayList<Date>();
}

SortedMap<Double, String> getFrequencyOfVisitedSites() {
SortedMap<Double, String> frequencyMap = new TreeMap<Double, String>(Collections.reverseOrder()); //we reverse order to sort from the highest percentage to the lowest.
Collection<String> domains = new HashSet<String>();
Frequency freq = new Frequency();
for (LogLine line : this.logLines) {
freq.addValue(line.getVisitedDomain());
domains.add(line.getVisitedDomain());
}

for (String domain : domains) {
frequencyMap.put(freq.getPct(domain), domain);
}

return frequencyMap;
}
}

此应用程序的目的是让我们的人力资源人员能够查看我们发送给他们的 Web 使用日志。但是,我确信随着时间的推移,我希望能够提供选项来查看访问站点的频率,以及 LogLine 的其他成员(例如分配类别的频率、访问类型 [文本/html、img/jpeg 等...] 过滤判断等)。理想情况下,我想避免为每种类型的数据编写单独的方法来编译数据,并且它们最终看起来都与 getFrequencyOfVisitedSites() 几乎相同。方法。

所以,我的问题是双重的:首先,从机械的角度来看,你能看到这种方法应该改进的地方吗?其次,您如何使该方法更通用,以便它能够处理任意数据集?

最佳答案

这与 Eugene 的解决方案基本相同,我只是将所有频率计算的东西留在了原始方法中,并仅使用该策略来让该领域工作。

如果你不喜欢枚举,你当然可以使用接口(interface)来代替。

public class WebUsageLog {
private Collection<LogLine> logLines;
private Collection<Date> dates;

WebUsageLog() {
this.logLines = new ArrayList<LogLine>();
this.dates = new ArrayList<Date>();
}

SortedMap<Double, String> getFrequency(LineProperty property) {
SortedMap<Double, String> frequencyMap = new TreeMap<Double, String>(Collections.reverseOrder()); //we reverse order to sort from the highest percentage to the lowest.
Collection<String> values = new HashSet<String>();
Frequency freq = new Frequency();
for (LogLine line : this.logLines) {
freq.addValue(property.getValue(line));
values.add(property.getValue(line));
}

for (String value : values) {
frequencyMap.put(freq.getPct(value), value);
}

return frequencyMap;
}

public enum LineProperty {
VISITED_DOMAIN {
@Override
public String getValue(LogLine line) {
return line.getVisitedDomain();
}
},
CATEGORY {
@Override
public String getValue(LogLine line) {
return line.getCategory();
}
},
VERDICT {
@Override
public String getValue(LogLine line) {
return line.getVerdict();
}
};

public abstract String getValue(LogLine line);
}
}

然后给定一个 WebUsageLog 的实例,你可以这样称呼它:
WebUsageLog usageLog = ...
SortedMap<Double, String> visitedSiteFrequency = usageLog.getFrequency(VISITED_DOMAIN);
SortedMap<Double, String> categoryFrequency = usageLog.getFrequency(CATEGORY);

关于java - 我的方法太具体了。我怎样才能使它更通用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2877061/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com