如何在另一个字符串(java)中找到字符串的哪一部分
如何找到newStr中字符串的哪一部分已经存在于oldStr中。我需要能够按如下方式分离新的Str:如何在另一个字符串(java)中找到字符串的哪一部分,java,string,Java,String,如何找到newStr中字符串的哪一部分已经存在于oldStr中。我需要能够按如下方式分离新的Str: 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"; 编辑: 让我说得更清楚些 旧的或新的str的任何部分都是未知的。 用户单击按钮,将显示n个日志。 用户对应用程序
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";
编辑:
让我说得更清楚些
旧的或新的str的任何部分都是未知的。
用户单击按钮,将显示n个日志。
用户对应用程序执行一些操作,然后再次单击按钮,并再次显示日志。
我想做的是以不同的颜色显示添加到日志中的新行
我希望这个解释有帮助 关于我在评论中的评论,我会这样做:
String newStrExistingContent = "bbb bbb bbb bbb";
String newStrNewContent = "ccc ccc ccc ccc ccc ccc ccc";
如果需要结果列表中的字符串,则需要重新组合各个标记,这应该不是什么大问题。我要做的是:
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]
正如您所见,我修改了您的测试字符串以证明,这将在不只是边缘的部分工作
当然,您可以将需要计算的匹配位置添加到结果列表中,但这应该很容易,如果您不使用不同类型的集合只添加不同的匹配,
对于这两种情况,我都建议使用HashMpamatched字符串,start position,但这并不是问题的一部分。感谢大家花时间研究这个问题 在这个论坛上认真搜索之后,我发现,我觉得最有效的方法是完成工作:
Match: [bbb bbb bbb bbb]
Match: [ ggg ]
Match: [ ]
Match: [ ]
Match: [ ]
Match: [ ]
把它们分开,把每一个放在一个列表中,迭代,从中删除已经存在的条目。你的问题没有明确定义。在OrdSTR中发现的NeSTR的一部分必须位于NeSTR的开始,还是可以位于中间?如果是在中间,你会把新内容放在什么地方?你需要找到一个最大长度的newStr子串,还是任何一个旧的子串?或者它必须是一个子字符串,或者正如@QQILHQ所假设的那样,它可以仅仅是分布在newStr中任何地方的字符吗?这是一个很大的含糊不清的问题,即使在这个例子中也是如此。你应该具体说明什么是匹配部分,比如它是否必须是连续的,它是否必须在最后,如果有多个匹配部分,等等。同样,像这样的问题,告诉你到目前为止所做的事情并显示一些代码通常是个好主意。@hyde我想你的意思是键入有点模糊,但你的打字错误使注释更准确。。。可能是这个的复制品。
Match: [bbb bbb bbb bbb]
Match: [ ggg ]
Match: [ ]
Match: [ ]
Match: [ ]
Match: [ ]
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();
}
}