请建议我一个合适的Java数据类型

时间:2015-03-23 14:49:20

标签: java data-structures

我有一个不那么难的问题,我想知道是否有人可以帮助我..

我有一个类似于“ Hello 我是人类 ”的字符串对象 我用Tess4J提取的。 接下来我试图找出这句话中的每个单词是粗体,斜体还是带下划线

之后我要求从方法中返回此信息以及源词。 问题是我不知道合适的数据类型来执行此操作。

如果可能,有人会建议我使用一个好的数据结构吗?

其他要点

  • 这个
  • 中有大量的单词
  • 单词可能会也可能不会复制

这是一个示例结构 -

"Hello" , true , false , false
"Hi", false , false , false
"Hi", true, true, false

非常感谢任何帮助, 谢谢, Sumal。

3 个答案:

答案 0 :(得分:6)

只需编写自己的课程。像这样:

public class FormattedText {
    private String text;
    private boolean bold;
    private boolean italic;
    private boolean underlined;

    // setter and getter
}

答案 1 :(得分:2)

我不确定为什么评论和答案会提示某些字段。通常,在创建类时,应该专注于接口

特别是,参考要点

  

这个

中有大量的单词

应该考虑字段无关紧要,并且可以将三个boolean字段压缩为单个int字段 - 大致如下:

class FormattedText {
    private String string;
    private int style;

    private static final int PLAIN = 0;
    private static final int BOLD = 1;
    private static final int ITALIC = 2;
    private static final int UNDERLINED = 4;

    FormattedText(String string, boolean bold, boolean italic, boolean underlined)
    {
        this.string = string; 
        if (bold) style |= BOLD;
        if (italic) style |= ITALIC;
        if (underlined) style |= UNDERLINED;
    }


    public String getString() {
        return string;
    }

    public boolean isBold() {
        return (style & BOLD) != 0;
    }

    public boolean isItalic() {
        return (style & ITALIC) != 0;
    }

    public boolean isUnderlined() {
        return (style & UNDERLINED) != 0;
    }   
}

甚至可以进一步“压缩”这一点。如果你真的必须处理这些条目的大量数量,并且取决于这些信息是否/如何改变,你可以考虑一个专用的数据结构,它存储有关所有单词的信息{{1例如。

答案 2 :(得分:1)

另一种自定义类方法,它尝试使用EnumSet(或Guava的Sets.immutableEnumSet())来避免多个布尔标记。

public class FormattedText {
    private final String text;
    private final Set<TextProperty> properties;

    public FormattedText(String text, TextProperty... properties) {
        this(text, EnumSet.copyOf(Arrays.asList(properties)));
    }

    public FormattedText(String text, Set<TextProperty> properties) {
        this.text = text;
        this.properties = properties;
    }

    // additional constructors, getters, logic
}

public enum TextProperty {
    BOLD, ITALIC, UNDERLINED;
}

像这样使用:

new FormattedText("Hello", TextProperty.BOLD);

这样,您只有一个字段,其中包含对其执行操作的所有必要属性和方法。你可以通过修改enum轻松添加新属性(删除线,上标等?),你不需要一百万个if-else块的字段。


或者,您甚至可以这样做:

public class FormattedText {
    private final String text;
    private final Set<TextProperty> properties;

    // constructors, getters, logic
}

public interface TextProperty {
    // a marker interface
}

public enum StandardTextProperty implements TextProperty {
    BOLD, ITALIC, UNDERLINED;
}

这样,如果您将代码部署为供其他人使用的库,则任何人都可以添加新属性。