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

时间:2014-05-01 18:22:59

标签: java string

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显示日志。 用户对应用程序执行某些操作,然后再次单击按钮,并再次显示日志。 我想要做的是显示添加新线以记录不同的颜色。

我希望这个解释有所帮助。

3 个答案:

答案 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();
    }
}