对于非描述性标题感到抱歉,我想不出一种方法可以解释它最好的100个单词。我希望能够做的是根据与主字符串关联的字符串和字符串数组“order”将字符串列表排序为“框”。
对于我目前的设置,我使用HashMap存储字符串,并将其关联到“按订单排列”字符串。
我知道我的解释是真的废话,所以我制作了一张图片,希望能更好地解释一下:
变量初始化如下:
private final String[] order = new String[] {"Severe", "Warning", "Info"};
private final Box[] boxes = new Box[] {new Box(1), new Box(2), new Box(3), new Box(4)};
private final Map<String, String> texts = new HashMap<String, String>();
texts.put("Server on fire!", "Severe");
texts.put("All is good!", "Info");
texts.put("Monkeys detected!", "Warning");
texts.put("Nuke activated!", "Severe");
这不应该太难实现,但我能想到的唯一方法是使用3个循环,这看起来有点浪费,如果有大量任何输入,它会很慢。
下面是一些示例代码,希望能够显示我到目前为止所提出的内容,也许可以解释问题,我没有测试它,也没有IDE方便,所以可能忽略了一些东西。
Set<Box> usedBoxes = new HashSet<Box>();
for(String curOrder : order) {
for (String text : texts) {
if (texts.get(text).equals(order)) {
for (Box box : boxes) {
if (!usedBoxes.contains(box)) {
box.setText(text);
usedBoxes.add(box);
break;
}
}
}
}
}
答案 0 :(得分:1)
我不确定我是否完全理解你想要达到的目标,但我觉得有两件事会让你的设计变得更简单:
请勿使用字符串作为严重级别。请改用枚举。枚举有一个名称,可能有其他字段和方法,并且使用它们的定义顺序自然排序。并且没有办法制作拼写错误并引入未知的严重性:它们是类型安全的
enum Severity {
SEVERE, WARNING, INFO
}
不要将内容存储在并行数组中或将它们与地图关联。定义一个包含对象信息的类:
public class Box {
private String text;
private Severity severity;
}
现在您已经拥有了这些内容,您只需创建一个List<Box>
,然后使用Comparator<Box>
对其进行排序,然后按严重程度对其进行排序,例如:
List<Box> boxes = Arrays.asList(new Box("Server is on fire", Severity.SEVERE),
new Box("All is good", Severity.INFO),
...);
Collections.sort(boxes, new Comparator<Box>() {
@Override
public int compare(Box b1, Box b2) {
return b1.getSeverity().compareTo(b2.getSeverity());
}
}
甚至更简单,使用Java 8:
boxes.sort(Comparator.comparing(Box::getSeverity));
答案 1 :(得分:1)
您应该制作&#34;状态&#34; (严重,信息等)进入Enum。
public enum StatusLevel {
Severe,
Warning,
Info;
}
只要您按照从上到下的顺序定义,就可以按StatusLevel
进行排序。
如果您希望直接提供Box
对象,而不是按时间或按字母顺序排除StatusLevel
或其他属性进行二次排序,则应实施自己的Comparator
此外,您可能需要查看SortedMap
或其他保留其订单的地图,这样您就不必每次都使用HashMap
因为它不能保证订单。