String 在Java 8中的字符串中插入文本
我有一张地图如下:String 在Java 8中的字符串中插入文本,string,java-8,String,Java 8,我有一张地图如下: {def_cd=[HighlightData(text=SOMECODE4, sections=[HighlightData.Section(startOffset=3, endOffset=4), HighlightData.Section(startOffset=7, endOffset=8)])]} public final class HighlightData { public final static class Section { p
{def_cd=[HighlightData(text=SOMECODE4, sections=[HighlightData.Section(startOffset=3, endOffset=4), HighlightData.Section(startOffset=7, endOffset=8)])]}
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;
}
}
这里的键是def_cd,值是List
HighlightData将文本和列表作为属性
我想将文本SOMECODE4转换为SOMECODE4
和的位置取决于startOffset和endOffset
HighlightData类如下所示:
{def_cd=[HighlightData(text=SOMECODE4, sections=[HighlightData.Section(startOffset=3, endOffset=4), HighlightData.Section(startOffset=7, endOffset=8)])]}
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;
}
}
我怎样才能做到这一点呢?地图的相关性还不清楚。如果键应该是指定的常量,那么检索映射值的规范方法是调用映射上的get,而映射的存在根本不值得在问题中提及
价值也需要澄清。显然,每个HighlightData都有一个要匹配的引用文本,但您没有指定是否可以有多个匹配。如果只有一个匹配项,那就更自然了,有一个将文本关联到一个节列表的映射。对于当前列表,必须线性迭代以找到匹配项
如果您不坚持寻找一个过度利用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列表按位置排序,并且没有重叠区域。请注意,此代码最大限度地减少了复制操作,即不调用子字符串,只将其附加到StringBuilder的末尾,因此结果内容在一次传递中创建。您可以通过为StringBuilder指定初始容量来稍微进一步提高性能,这将是
text.length+.length*h.getSections.size…我对地图本身的适用性有点迷茫,但这相当简单。您可以从字面上检索列表,并将文本划分为相应的子字符串,用突出显示标记包装子字符串部分。总的来说,这看起来真的是一个奇怪的设计,可能有更好的方法。如果你发布代码来构建你复制的字符串表示形式的映射,你会有更高的机会得到别人的帮助。让人们解析一些随机字符串表示来重建测试数据会降低获得正确答案的机会。