在Java 8中的字符串中插入文本

时间:2016-12-19 07:32:51

标签: string java-8

我有Map<String, List<highlightData>>如下:

{def_cd=[HighlightData(text=SOMECODE4, sections=[HighlightData.Section(startOffset=3, endOffset=4), HighlightData.Section(startOffset=7, endOffset=8)])]}

此处keydef_cdvalueList<HighlightData>

HighlightDatatextList<Section>作为属性。

我想将文字SOMECODE4转换为SOM<highlight>E</highlight>COD<highlight>E</highlight>4

<highlight></highlight>的排名取决于startOffsetendOffset

HighlightData课程如下:

 public final class HighlightData {
    public final static class Section {
        private final int startOffset;
        private final int endOffset;

        public Section(int startOffset, int endOffset) {
            this.startOffset = startOffset;
            this.endOffset = endOffset;
        }

        public int getStartOffset() {
            return startOffset;
        }

        public int getEndOffset() {
            return endOffset;
        }
    }

    private String text;

    private List<Section> sections;

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public List<Section> getSections() {
        return sections;
    }

    public void setSections(List<Section> intervals) {
        this.sections = intervals;
    }

}

我该怎么做?

1 个答案:

答案 0 :(得分:0)

Map的相关性尚不清楚。如果键应该是指定的常量,则检索映射值的规范方法是在地图上调用get,并且在问题中根本不存在地图的存在。

价值也需要澄清。显然,每个HighlightData都有一个要匹配的引用文本,但是您没有指定是否可以存在多个匹配项。如果只能有一个匹配,那么拥有一个将文本与Section列表相关联的地图会更自然。使用当前列表,您必须线性迭代才能找到匹配项。

如果您不坚持寻找(过)使用Java 8功能的解决方案,那么构造结果字符串是微不足道的:

String text = "SOMECODE4";
for(HighlightData h: map.get("def_cd")) {
    if(h.getText().equals(text)) {
        StringBuilder sb=new StringBuilder();
        int lastPos=0;
        for(HighlightData.Section s: h.getSections()) {
            sb.append(text, lastPos, s.getStartOffset())
              .append("<highlight>")
              .append(text, s.getStartOffset(), lastPos=s.getEndOffset())
              .append("</highlight>");
        }
        text=sb.append(text, lastPos, text.length()).toString();
        break; // remove, if multiple matches are possible
    }
}

此代码假定HighlightData.Section列表按位置排序且没有重叠区域。请注意,此代码最小化了复制操作,即不调用substring并仅附加到StringBuilder的末尾,因此结果内容将在单个传递中创建。您可以通过指定StringBuilder的初始容量来进一步提高性能 text.length() + "<highlight></highlight>".length()*h.getSections().size() ...