Java 字符串片段组合拼图

Java 字符串片段组合拼图,java,Java,假设我得到了一个字符串片段列表。两个片段可以在其重叠的子字符串上连接 e、 g “sad”和“den”=“saden” “fat”和“cat”=不能组合 样本输入: aw是poq qo 样本输出: 阿瓦斯波库酒店 那么,编写一个通过组合列表中的字符串来查找最长字符串的方法的最佳方法是什么呢。如果字符串是无限的,则输出应为“无限” 公共类StringUtil{ 公共静态字符串组合(列表片段){ StringBuilder合并=新的StringBuilder(); 对于(int i=0;i

假设我得到了一个字符串片段列表。两个片段可以在其重叠的子字符串上连接

e、 g

“sad”和“den”=“saden”

“fat”和“cat”=不能组合

样本输入:

aw是poq qo

样本输出:

阿瓦斯波库酒店

那么,编写一个通过组合列表中的字符串来查找最长字符串的方法的最佳方法是什么呢。如果字符串是无限的,则输出应为“无限”

公共类StringUtil{
公共静态字符串组合(列表片段){
StringBuilder合并=新的StringBuilder();
对于(int i=0;i
以下是我的JUnit测试:

public class StringUtilTest {

    @Test
    public void combine() {
        List<String> fragments = new ArrayList<String>();
        fragments.add("aw");
        fragments.add("was");
        fragments.add("poq");
        fragments.add("qo");
        String result = StringUtil.combine(fragments);
        assertEquals("awas poqo", result);
    }
}
公共类StringUtilTest{
@试验
公共图书馆{
List fragments=new ArrayList();
加上(“aw”);
添加(“was”);
添加(“poq”);
添加(“qo”);
String result=StringUtil.combine(片段);
资产质量(“awas poqo”,结果);
}
}
这段代码对我来说似乎不起作用。。。它返回一个空字符串:

org.junit.ComparisonFailure: expected:<[awas poqo]> but was:<[]>
org.junit.ComparisonFailure:应为:但为:

我怎样才能让它工作?还有,如何让它检查无限字符串?

我不明白
fragments.get(I).length()-1
应该是
字符。你显然是故意的,但我看我这辈子都说不出这个目的是什么。长度<63的字符串将转换为非字母的ASCII(Unicode?)字符

我想您是想比较一个片段中的最后一个字符和另一个片段中的第一个字符,但我不认为这就是代码所做的

我的有用答案是撤销一些方法链接(
function().otherFunction()
),将结果存储在临时变量中,并使用调试器逐步完成。将问题分解为您理解的小步骤,并验证代码是否正在执行您认为应该在每个步骤中执行的操作。一旦它起作用,然后再回到链接

编辑:好吧,我很无聊,我喜欢教书。这闻起来像作业,所以我不会给你任何代码

1) 方法链接只是一种方便。你可以(也应该)做:

String tempString=fragments.get(i)

int lengthOfString=tempString.length()-1

char lastChar=(char)lengthOfString//错误

等等。 这可以让您看到中间步骤,并思考您正在做什么。您实际上是获取字符串的长度,例如3,并将该整数转换为字符。您确实需要字符串中的最后一个字符。如果不使用方法链接,则必须声明一种中间变量类型,这当然会迫使您考虑该方法实际返回的内容。这就是为什么我告诉您在熟悉函数之前放弃方法链接

2) 我猜在您编写函数的时候,编译器抱怨它不能从int隐式转换为char。然后您显式转换为char以使其关闭并编译。现在您正试图找出它在运行时失败的原因。这一课是在学习的同时听编译器。如果它在抱怨,你就把事情搞砸了


3) 我知道还有别的事。调试。如果你想编码,你需要学习如何做到这一点。大多数IDE都会提供一个设置断点的选项。了解如何使用此功能并逐行“逐步浏览”代码。想想你到底在做什么。写下两个字母对的算法,用手在纸上一步一步地执行。然后一步一步地看代码做了什么,直到你看到它做了一些你认为不对的事情。最后,修复没有提供所需结果的部分

我不明白
fragments.get(I).length()-1
应该是
char
。你显然是故意的,但我看我这辈子都说不出这个目的是什么。长度<63的字符串将转换为非字母的ASCII(Unicode?)字符

我想您是想比较一个片段中的最后一个字符和另一个片段中的第一个字符,但我不认为这就是代码所做的

我的有用答案是撤销一些方法链接(
function().otherFunction()
),将结果存储在临时变量中,并使用调试器逐步完成。将问题分解为您理解的小步骤,并验证代码是否正在执行您认为应该在每个步骤中执行的操作。一旦它起作用,然后再回到链接

编辑:好吧,我很无聊,我喜欢教书。这闻起来像作业,所以我不会给你任何代码

1) 方法链接只是一种方便。你可以(也应该)做:

String tempString=fragments.get(i)

int lengthOfString=tempString.length()-1

char lastChar=(char)lengthOfString//错误

等等。 这可以让您看到中间步骤,并思考您正在做什么。您实际上是获取字符串的长度,例如3,并将该整数转换为字符。您确实需要字符串中的最后一个字符。如果不使用方法链接,则必须声明一种中间变量类型,这当然会迫使您考虑该方法实际返回的内容。这就是为什么我告诉您在熟悉函数之前放弃方法链接

(二)
org.junit.ComparisonFailure: expected:<[awas poqo]> but was:<[]>
public static String combine(List<String> fragments) {
    StringBuilder combined = new StringBuilder();
    for (String fragment : fragments) {
        if (combined.length() == 0) {
            combined.append(fragment);
        } else if (combined.charAt(combined.length() - 1) == fragment.charAt(0)) {
            combined.append(fragment.substring(1));
        } else {
            combined.append(" " + fragment);
        }
    }
    return combined.toString();
}
public static String combine(List<String> fragments) {
    StringBuilder combined = new StringBuilder();
    for (String fragment : fragments) {
        if (combined.length() == 0) {
            combined.append(fragment);
        } else if (combined.charAt(combined.length() - 1) == fragment.charAt(0)) {
            int i = 1;
            while (i < fragment.length() && i < combined.length() && combined.charAt(combined.length() - i - 1) == fragment.charAt(i))
                i++;
            combined.append(fragment.substring(i));
        } else {
            combined.append(" " + fragment);
        }
    }
    return combined.toString();
}