按单独的字符串排序值

时间:2014-05-31 14:37:26

标签: java

对于非描述性标题感到抱歉,我想不出一种方法可以解释它最好的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");

No! 这不应该太难实现,但我能想到的唯一方法是使用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;
                }
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

我不确定我是否完全理解你想要达到的目标,但我觉得有两件事会让你的设计变得更简单:

  1. 请勿使用字符串作为严重级别。请改用枚举。枚举有一个名称,可能有其他字段和方法,并且使用它们的定义顺序自然排序。并且没有办法制作拼写错误并引入未知的严重性:它们是类型安全的

    enum Severity {
        SEVERE, WARNING, INFO
    }
    
  2. 不要将内容存储在并行数组中或将它们与地图关联。定义一个包含对象信息的类:

    public class Box {
        private String text;
        private Severity severity;
    }
    
  3. 现在您已经拥有了这些内容,您只需创建一个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因为它不能保证订单。