我有Map<String, List<highlightData>>
如下:
{def_cd=[HighlightData(text=SOMECODE4, sections=[HighlightData.Section(startOffset=3, endOffset=4), HighlightData.Section(startOffset=7, endOffset=8)])]}
此处key
为def_cd
,value
为List<HighlightData>
。
HighlightData
有text
和List<Section>
作为属性。
我想将文字SOMECODE4
转换为SOM<highlight>E</highlight>COD<highlight>E</highlight>4
<highlight>
和</highlight>
的排名取决于startOffset
和endOffset
。
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;
}
}
我该怎么做?
答案 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()
...