String oldStr = "aaa aaa aaa aaa aaa aaa aaa aaa aaa aaa aaa bbb bbb bbb bbb";
String newStr = "bbb bbb bbb bbb ccc ccc ccc ccc ccc ccc ccc";
如何在oldStr中找到newStr中的字符串部分。我需要能够将新的Str分开,如下所示:
String newStrExistingContent = "bbb bbb bbb bbb";
String newStrNewContent = "ccc ccc ccc ccc ccc ccc ccc";
编辑: 让我说清楚一点。
不知道旧的或新的str的一部分。 用户单击按钮n显示日志。 用户对应用程序执行某些操作,然后再次单击按钮,并再次显示日志。 我想要做的是显示添加新线以记录不同的颜色。
我希望这个解释有所帮助。
答案 0 :(得分:0)
关于我在评论中的评论,我就是这样做的:
String oldStr = "aaa aaa aaa aaa aaa aaa aaa aaa aaa aaa aaa bbb bbb bbb bbb";
String newStr = "bbb bbb bbb bbb ccc ccc ccc ccc ccc ccc ccc";
// List<String> s1 = Arrays.asList(oldStr.split("\\s"));
// better:
Set<String> s1 = new HashSet<String>(Arrays.asList(oldStr.split("\\s")));
List<String> s2 = Arrays.asList(newStr.split("\\s"));
List<String> existing = new ArrayList<String>();
List<String> nonExisting = new ArrayList<String>();
for (String s : s2) {
if (s1.contains(s)) {
existing.add(s);
} else {
nonExisting.add(s);
}
}
System.out.println("existing: " + existing);
System.out.println("non existing: " + nonExisting);
// existing: [bbb, bbb, bbb, bbb]
// non existing: [ccc, ccc, ccc, ccc, ccc, ccc, ccc]
如果您需要结果List
中的字符串,则需要重新组合各个令牌,这不应该是一个大问题。
答案 1 :(得分:0)
我要做的是:
public class PartFinder {
public static void main(String[] args) {
String oldStr = "aaa aaa aaa aaa aaa ggg aaa aaa aaa aaa aaa bbb bbb bbb bbb";
String newStr = "bbb bbb bbb bbb ccc ggg ccc ccc ccc ccc ccc";
String trim = newStr;
String tmp;
List<String> matches = new ArrayList<>();
while (trim.length() > 0) {
tmp = trim;
boolean inner = true;
while (tmp.length() > 0 && inner) {
if (oldStr.contains(tmp)) {
matches.add(tmp);
trim = trim.substring(tmp.length());
inner = false;
}
tmp = tmp.substring(0, tmp.length() - 1);
}
trim = trim.substring(1);
}
for (String s : matches) {
System.out.println("Match: [" + s + "]");
}
}
}
输出
Match: [bbb bbb bbb bbb]
Match: [ ggg ]
Match: [ ]
Match: [ ]
Match: [ ]
Match: [ ]
正如您所看到的那样,我修改了您的测试字符串以证明这一点,这将不仅仅在边缘处起作用
你当然可以添加到匹配的结果列表位置(需要计算,但它应该很容易),如果你不使用不同类型的集合只添加不同的匹配,
对于这两种情况,我建议使用HashMpa<String,Integer>
(匹配的字符串,起始位置),但这不是问题的一部分。
答案 2 :(得分:0)
感谢大家花时间研究这个问题。
在这个论坛上进行了一些认真的搜索之后,我发现,我认为最有效的方法是完成工作:
public class StringOverlap
{
public static String findOverlap(String s1, String s2)
{
if (s1 == null)
return s2;
if (s2 == null)
return s1;
int len = Math.min(s1.length(), s2.length());
// Find the index for the end of overlapping part
int index = -1;
for (int i = len; i > 0; i--)
{
String substring = s2.substring(0, i);
if (s1.endsWith(substring))
{
index = i;
break;
}
}
StringBuilder sb = new StringBuilder(s1);
if (index < 0)
sb.append(s2);
else
if (index <= s2.length())
sb.append(s2.substring(index));
return sb.toString();
}
}