- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
更新,添加评论中的问题:
what's the best way to get the Map into Map where Foo is an Enum. it just seems awfully complicated when, conceptually, not a complex idea.
此代码起作用,它是简单 MUD client 的一部分.基本思想是Monitor
保存将在游戏过程中显示给用户的数据(生命值等),可能在辅助设备中 JPanel
;沿着这些路线的东西。此报告的可能值在 Attribs
中作为Enum
.
在走得太远之前,当我查看 Monitor
类以及创建单个实例所需的内容似乎有点冗长。
如果我移动convertToEnumEntry
来自 Monitor
那么这个类就不行了。所以,类(class)不能变小,我不认为。有没有我可以使用(或使用得更好)的模式?
此类中的所有内容都基于以下假设:如果 convertToEnumEntry
返回对 Map.Entry
的空引用然后得到一个,具体String
这不适合 Attribs
:
enemy = stringEntry.getKey();
与其他键不同,敌人可以是任何 String
.其他键仅限于 Enum
Attribs
的值(属性)。
public class Monitor {
private static Logger log = Logger.getLogger(Monitor.class.getName());
private Map<Attribs, Ratio> mapOfAttributes = new HashMap<>();
private String enemy = null;
private Monitor() {
}
public Monitor(Map<String, Ratio> mapStringToRatio) {
init(mapStringToRatio);
}
private void init(Map<String, Ratio> mapStringToRatio) {
SimpleEntry<Attribs, Ratio> attribsEntry = null;
for (Entry<String, Ratio> stringEntry : mapStringToRatio.entrySet()) {
attribsEntry = null;
attribsEntry = convertToEnumEntry(stringEntry);
if (attribsEntry != null) {
mapOfAttributes.put(attribsEntry.getKey(), attribsEntry.getValue());
} else {
enemy = stringEntry.getKey(); //assumes key is enemy value
mapOfAttributes.put(Attribs.ENEMY, stringEntry.getValue());
}
}
}
private SimpleEntry<Attribs, Ratio> convertToEnumEntry(Entry<String, Ratio> stringEntry) {
Ratio ratio = stringEntry.getValue();
SimpleEntry<Attribs, Ratio> attribEntry = null;
for (Attribs attribute : Attribs.values()) {
if (stringEntry.getKey().equalsIgnoreCase(attribute.name())) {
attribEntry = new HashMap.SimpleEntry<>(attribute, ratio);
}
}
return attribEntry;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("\nfighting\t\t" + enemy + "\n");
for (Map.Entry<Attribs, Ratio> e : mapOfAttributes.entrySet()) {
sb.append("\n");
sb.append(e.getKey().name());
sb.append("\t");
sb.append(e.getValue().toString());
}
sb.append("\n");
return sb.toString();
}
}
将所有内容都塞进任一类来解析和构建 Map
是很有诱惑力的。 , 或将所有内容放入 Monitor
.目前,RegexMapBuilder
是一种中间立场,因为它完成了大部分艰苦的工作,但并没有完全构建完整的 Monitor
就其本身而言:
public class RegexMapBuilder {
public static Map<String, Ratio> stringToRatiosMap(String input) {
Map<String, Ratio> mapOfStringsToRatios = new HashMap<>();
Map<String, String> strings = stringMap(input);
Pattern fraction = Pattern.compile("(\\d+)/(\\d+)");
Pattern wholeNumber = Pattern.compile("(\\d+)");
Pattern percent = Pattern.compile("(\\d+)%");
Matcher matcher;
int numerator, denominator;
Ratio ratio = null; //need numerator and denominator values
for (Entry<String, String> e : strings.entrySet()) {
matcher = wholeNumber.matcher(e.getValue());
while (matcher.find()) {
numerator = Integer.parseInt(matcher.group(1));
denominator = 1;
ratio = new Ratio(numerator, denominator);
}
matcher = fraction.matcher(e.getValue());
while (matcher.find()) {
numerator = Integer.parseInt(matcher.group(1));
denominator = Integer.parseInt(matcher.group(2));
ratio = new Ratio(numerator, denominator);
}
matcher = percent.matcher(e.getValue());
while (matcher.find()) {
numerator = Integer.parseInt(matcher.group(1));
denominator = 100;
ratio = new Ratio(numerator, denominator);
}
mapOfStringsToRatios.put(e.getKey(), ratio);
}
return mapOfStringsToRatios;
}
private static Map<String, String> stringMap(String input) {
Map<String, String> strings = new HashMap<>();
Pattern pattern = Pattern.compile("(\\w+): +(\\S+)");
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
strings.put(matcher.group(1), matcher.group(2));
}
return strings;
}
}
为简洁起见,我省略了 Enum
,但是Attribs
只是此报告打印的一些属性的列表。唯一棘手的部分是有一个值不是真正的枚举类型。
最佳答案
我认为java.util.EnumMap可能是你要找的。您可以使用 Enum#valueOf从给定的字符串中查找枚举值,就像 Sam Yonnou 提到的那样。
关于java - 如何在包装器中最好地将 Map<String,Foo> 转换为 Map<MyEnum,Foo>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20680377/
public class Foo : IFoo ... 和有什么区别 IFoo foo = new Foo(); 和 Foo foo = new Foo(); 最佳答案 区别仅在于变量的声明类型。每当
class Foo { public: explicit Foo() {} explicit Foo(Foo&) {} }; Foo d = Foo(); error: no matc
是 foo as? Foo完全等同于 foo as Foo? ? 如果是,那为什么两者都有? 如果不是,那么有什么区别? 最佳答案 as?是 safe cast operator . 通常,如果您尝试
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
这个问题在这里已经有了答案: Why is there an injected class name? (1 个回答) 关闭5年前。 一位同事不小心写了这样的代码: struct foo { fo
我遇到了这些关键字::foo、::foo、::bar/foo 和 :bar/foo 您能举例说明差异吗? 最佳答案 :foo 是一个非完全限定的关键字。它没有关联的命名空间。 (name :foo)
有人问我如何简化这个 lambda (Foo foo) -> foo.getName() 还有更好的写法吗? 最佳答案 Foo::getName。 假设getName是一个实例方法,其签名中的参数列表
编写此规则集的 CSS 组合器或简写是什么? foo bar, foo biz, foo gaz > boo, foo tar { ... } 我很确定我在 MDN 的某处读到过有一个。是不是: f
我有一个用这个字符串填充的输入文本 "foo foo"但插入后字符串看起来像这样 "foo foo" .我该如何解决?我想以第一种格式显示字符串! 最佳答案 你可能有这样的事情: " /> 更改 va
假设我有一个不可复制类Foo,它的构造函数之一恰好接收到对 Foo 的引用。 class Foo { public: Foo(Foo& parent) {...} private: v
class Artist @@song_count = [] attr_accessor :name, :songs def initialize(name) @name = name
请解释为什么这些 Perl 函数的调用方式在函数定义之上决定了它们是否运行。 print "Why does this bare call to foo not run?\n"; foo; print
文件名分为三种类型 首先( Root 于某种“当前工作目录”之下) ../foo ./foo bar/foo # really in this group? 和( Root 于绝对路径,独立于 CWD
我想自动连接 foo: @Autowired Foo foo 但我无法修改类 Foo 并将其标记为 @Component。 Autowiring foo 最干净的方法是什么? 顺便说一句,如果您需要使
我一直在使用 Python 的 ElementTree 创建 XML 文档,到目前为止一切顺利。然而我现在面临的问题是,由于项目要求,我需要生成一个 XML 文档,其中包含带有开始和结束标签的元素以及
class Foo { public: Foo(){} private: Foo(const Foo &); }; Foo f(); Foo f1 = Foo(); 我发现当我将 Fo
我有一个 jquery 对话框,上面有一个按钮(我的按钮,不是对话框按钮之一)。 设置对话框后,我有以下代码: $('#bar').click(foo('baz')); 当我加载页面并显示对话框时,f
我遇到了以下变量的情况: var foo: Foo | Foo | Foo; 动态生成(使用 keyof 和 stuff),这在代码的那个点是完全有意的。但是,我需要调用像这样定义的对象内部的方法:
clang 3.5.0 和 gcc 4.9.1 从代码生成的可执行文件 #include struct Foo { Foo() { std::cout << "Foo()" << std::e
对于声明为 Foo& foo = ...; 的 foo,lambdas 的按值捕获和按引用捕获语义之间有什么区别吗? 最佳答案 我认为你已经陷入了一个常见的误解......引用是对真实对象的别名。初始
我是一名优秀的程序员,十分优秀!