Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在另一个字符串(java)中找到字符串的哪一部分_Java_String - Fatal编程技术网

如何在另一个字符串(java)中找到字符串的哪一部分

如何在另一个字符串(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个日志。 用户对应用程序

如何找到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 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();
    }
}