Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按单独的字符串对值排序_Java - Fatal编程技术网

Java 按单独的字符串对值排序

Java 按单独的字符串对值排序,java,Java,对不起,这个非描述性的标题,我想不出一个更好的办法来解释它,只有100个字。我希望能够根据与主字符串关联的字符串和字符串数组“顺序”,将字符串列表排序为“框” 对于我当前的设置,我使用HashMap来存储字符串及其关联的“按顺序放置”字符串 我知道我的解释真的是胡说八道,所以我制作了一个图像,希望能更好地解释: 变量的初始化如下所示: private final String[] order = new String[] {"Severe", "Warning", "Info"}; privat

对不起,这个非描述性的标题,我想不出一个更好的办法来解释它,只有100个字。我希望能够根据与主字符串关联的字符串和字符串数组“顺序”,将字符串列表排序为“框”

对于我当前的设置,我使用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");
私有最终字符串[]顺序=新字符串[]{“严重”、“警告”、“信息”};
专用最终框[]框=新框[]{新框(1)、新框(2)、新框(3)、新框(4)};
私有最终映射文本=新HashMap();
文本。放置(“服务器着火!”,“严重”);
text.put(“一切都很好!”,“Info”);
text.put(“检测到猴子!”,“警告”);
文本。放置(“核武器激活!”,“严重”);
这应该不太难实现,但我能想到的唯一方法是使用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;
                }
            }
        }
    }
}
Set usedbox=new HashSet();
for(字符串curOrder:order){
用于(字符串文本:文本){
if(text.get(text.equals(order)){
用于(盒子:盒子){
如果(!usedbox.contains(box)){
box.setText(文本);
usedbox.add(框);
打破
}
}
}
}
}

我不确定我是否完全理解您想要实现的目标,但我觉得有两件事可以让您的设计更简单:

  • 不要将字符串用于严重性级别。改用枚举。枚举有一个名称,可能有其他字段和方法,并且自然地使用它们的定义顺序进行排序。而且没有办法输入错误并引入未知的严重性:它们是类型安全的

    enum Severity {
        SEVERE, WARNING, INFO
    }
    
  • 不要以并行数组存储东西,也不要将它们与地图关联。定义包含对象信息的类:

    public class Box {
        private String text;
        private Severity severity;
    }
    
  • 现在您已经有了这些,您只需创建一个
    列表
    ,并使用
    比较器对其进行排序,比较器按严重性排序,例如:

    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());
        }
    }
    
    您应该将您的“状态”(严重、信息等)写入枚举

    public enum StatusLevel {
        Severe,
        Warning,
        Info;
    }
    
    然后,您可以按
    StatusLevel
    本机排序,只要您按照从上到下的顺序定义

    如果您想直接提供
    对象,而不需要拉出
    状态级别
    ,或者通过其他属性(如时间或字母顺序)进行二次排序,您应该实现自己的排序


    此外,您可能希望查看保持其顺序的映射或其他映射,这样您就不必每次都求助于
    HashMap
    ,因为它不能保证顺序。

    也许这会有所帮助:将严重性用作字符串的原因是我希望它可供最终用户自定义。然后将其作为实现可比较性的类,具有名称和等级属性(等级是将严重性与另一严重性进行比较的方式)。
    public enum StatusLevel {
        Severe,
        Warning,
        Info;
    }