带测试的 Java 代码 - 无限循环?

2024-04-18

我尝试去了解人与人之间的关系。但是,当我运行单元测试时,测试会永远运行,没有得到结果,而且我的 CPU 使用率很高。 有人能看出我的代码有什么问题吗?

字符串关系是字符串的多行输入,格式为"A , B C , D" where A是的父级B and C是的父级D.

这是代码和字符串格式输入的默认构造函数。我们不需要检查格式是否正确:

public SeeRelations(String relations){
    this.relations = relations;
}

这是从格式化输入中获取字符串的每一行的辅助函数:

//helper function to get each line of the string
private ArrayList<String> lineRelations(){
    int i;
    ArrayList<String> lineRelations = new ArrayList<String>();
    String[] lines = relations.split("\n");
    for(i = 0; i < lines.length; i++){
        lineRelations.add(lines[i]);
    }
    return lineRelations;
}

这是将输入格式化字符串中的所有关系放入数组列表的函数:

//helper function to put each of the relationship in arraylists
private ArrayList<ArrayList<String>> allRelations(){
    int i;
    ArrayList<ArrayList<String>> allRelations = new ArrayList<ArrayList<String>>();
    ArrayList<String> lineRelations = lineRelations();
    for(i = 0; i < lineRelations.size(); i++){
        ArrayList<String> eachLine = new ArrayList<String>(Arrays.asList(lineRelations.get(i).split("\\s*,\\s*")));
        allRelations.add(eachLine);
    }
    return allRelations;
}

这是检查输入名称是否存在的方法:

//helper function to see if the name exist for seeRelations()
private boolean hasThisName(String name){
    ArrayList<ArrayList<String>> allRelations = allRelations();
    int i;
    int j;
    for(i = 0; i < allRelations.size(); i++){
        for(j = 0; j < allRelations.get(i).size(); j++){
            if(name.equals(allRelations.get(i).get(j))){
                return true;
            }
        }
    }
    return false;
}

这是获取两个人之间代数的函数:

//helper function to get Generation number of seeRelations()
private int getGenerationNum(String person, String ancestor){
    ArrayList<ArrayList<String>> allRelations = allRelations();
    String name;
    int i;
    int j;
    int generationNum = 0;
    for(i = 0, j = 0, name = ancestor; i < allRelations.size(); i++){
        if(name.equals(allRelations.get(i).get(0)) && !person.equals(allRelations.get(i).get(1))){
            generationNum++;
            ancestor = allRelations.get(i).get(1);
            i = 0;
            j = 1;
        }
        else if(ancestor.equals(allRelations.get(i).get(0)) && person.equals(allRelations.get(i).get(1))){
            generationNum++;
            j = 1;
            break;
        }
    }
    if(j == 0){
        return 0;
    }
    else{
        return generationNum;
    }
}

这是获得倍数的方法"great"最终输出:

private String great(int num){
    int i;
    String great = "";
    for(i = 0; i < num; i++){
        great += "great";
    }
    return great;
}

这是我检查两个人关系的最后一个方法:

public String SeeRelations(String person, String ancestor){
    int generationNum = getGenerationNum(person, ancestor);
    String great = great(generationNum  - 2);
    if(!(hasThisName(person) && hasThisName(ancestor))){
        return null;
    }
    else{
        if(generationNum == 0){
            return null;
        }
        else if(generationNum == 1){
            return ancestor + " is the parent of " + person;
        }
        else if(generationNum == 2){
            return ancestor + " is the grandparent of " + person;
        }
        else{
            return ancestor + " is the" + " " +  great +"grandparent of " + person;
          }
    }
}

这是我的测试用例,它永远运行并且无法得到结果

public class FamilyTreeTest {

    @Test
    public void testSeeRelations() {
        FamilyTree relation2 = new FamilyTree("John Doe ,   Mary Smith" + "\n" + "Martin Weasel ,  John Doe");
        assertEquals("Martin Weasel is the grandparent of Mary Smith", familyTree2.SeeRelations("Mary Smith", "Martin Weasel"));
    }

 for(i = 0, j = 0, name = ancestor; i < allRelations.size(); i++){
            if(name.equals(allRelations.get(i).get(0)) && !person.equals(allRelations.get(i).get(1))){
                generationNum++;
                ancestor = allRelations.get(i).get(1);
                i = 0;
                j = 1;
            }
            else if(ancestor.equals(allRelations.get(i).get(0)) && person.equals(allRelations.get(i).get(1))){
                generationNum++;
                j = 1;
                break;
            }
        }

这是你的错误线路 在你的情况下,你的祖先/名字是“马丁黄鼠狼”,马丁的关系是“约翰·多伊”,但你正在寻找玛丽·史密斯,所以name.equals(allRelations.get(i).get(0)) && !person.equals(allRelations.get(i).get(1)))这是true和这个i = 0;使你的循环从头开始

你能做什么,尝试创建对象人 IE 类人{ 字符串名称; 列出儿童; 列出父母名单; ... } 然后做简单的树步行者

int SearchDown(Person person, String searchedRelation,int generation)
{
if person.getName().equals(searchedRelation())
return generation;
for (Person child: person.getChildren())
{
int generation = SearchDown(child, searchedRelation, generation+1);
if (generation!=-1) return generation;
}
return -1;
}

etc...

我真的发现这种方法更容易处理所有类型的树木

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带测试的 Java 代码 - 无限循环? 的相关文章

  • 我是否需要安装 SQLite 才能使 SQLiteJDBC 正常工作?

    我想我只是没有 明白 如果我的计算机上尚未安装 SQLite 并且我想编写一个使用嵌入式数据库的 Java 应用程序 并且我将 SQLiteJDBC JAR 下载 导入到我的项目中 那么这就是我所需要的吗 或者 我是否需要先安装 SQLit
  • Netbeans 8.1 Gnome 3 GTK+ UI 字体和选项卡高度

    我刚刚在运行 GNOME 3 桌面的 Ubuntu 16 04 上安装了 NetBeans 8 1 如果可能的话 我想继续使用 IDE 的 GTK 外观和感觉 但 UI 上的字体 尤其是选项卡中的字体 太小且重叠 我尝试添加 fontsiz
  • java中监视目录变化

    我正在使用 WatchService 来监视目录中的更改 特别是目录中新文件的创建 下面是我的代码 package watcher import java nio file import static java nio file Stand
  • Android:文本淡入和淡出

    我已阅读此 stackoverflow 问题和答案 并尝试实现文本淡入和淡出 Android中如何让文字淡入淡出 https stackoverflow com questions 8627211 how to make text fade
  • 如何调试“com.android.okhttp”

    在android kitkat中 URLConnection的实现已经被OkHttp取代 如何调试呢 OkHttp 位于此目录中 external okhttp android main java com squareup okhttp 当
  • 如何在 Java 中向时间戳添加/减去时区偏移量?

    我正在使用 JDK 8 并且玩过ZonedDateTime and Timestamp很多 但我仍然无法解决我面临的问题 假设我得到了格式化的Timestamp在格林威治标准时间 UTC 我的服务器位于某处 假设它设置为Asia Calcu
  • 从 MATLAB 调用 Java?

    我想要Matlab程序调用java文件 最好有一个例子 需要考虑三种情况 Java 内置库 也就是说 任何描述的here http docs oracle com javase 6 docs api 这些项目可以直接调用 例如 map ja
  • 如何在单个查询中搜索 RealmObject 的 RealmList 字段

    假设我有一堂课 public class Company extends RealmObject private String companyId private RealmList
  • Java 中如何将 char 转换为 int? [复制]

    这个问题在这里已经有答案了 我是Java编程新手 我有例如 char x 9 我需要得到撇号中的数字 即数字 9 本身 我尝试执行以下操作 char x 9 int y int x 但没有成功 那么我应该怎么做才能得到撇号中的数字呢 ASC
  • Sun 在 EDT 之外做 GUI 工作的演示?

    我正在看SplashDemo java http download oracle com javase tutorial uiswing examples misc SplashDemoProject src misc SplashDemo
  • 如何在 ant 中为 junit 测试设置 file.encoding?

    我还没有完全完成file encoding 和 ant https stackoverflow com questions 1339352 how do i set dfile encoding within ants build xml
  • Jetty、websocket、java.lang.RuntimeException:无法加载平台配置器

    我尝试在 Endpoint 中获取 http 会话 我遵循了这个建议https stackoverflow com a 17994303 https stackoverflow com a 17994303 这就是我这样做的原因 publi
  • JDBC 时间戳和日期 GMT 问题

    我有一个 JDBC 日期列 如果我使用 getDate 则会得到 date 仅部分2009 年 10 月 2 日但如果我使用 getTimestamp 我会得到完整的 date 2009 年 10 月 2 日 13 56 78 890 这正
  • 不可变的最终变量应该始终是静态的吗? [复制]

    这个问题在这里已经有答案了 在java中 如果一个变量是不可变的并且是final的 那么它应该是一个静态类变量吗 我问这个问题是因为每次类的实例使用它时创建一个新对象似乎很浪费 因为无论如何它总是相同的 Example 每次调用方法时都会创
  • Java Swing - 如何禁用 JPanel?

    我有一些JComponents on a JPanel我想在按下 开始 按钮时禁用所有这些组件 目前 我通过以下方式显式禁用所有组件 component1 setEnabled false 但是有什么办法可以一次性禁用所有组件吗 我尝试禁用
  • 使用 HtmlUnit 定位弹出窗口

    我正在构建一个登录网站并抓取一些数据的程序 登录表单是一个弹出窗口 所以我需要访问这个www betexplorer com网站 在页面的右上角有一个登录链接 写着 登录 我单击该链接 然后出现登录弹出表单 我能够找到顶部的登录链接 但找不
  • 将 JScrollPane 添加到 JFrame

    我有一个关于向 Java 框架添加组件的问题 我有一个带有两个按钮的 JPanel 和一个添加了 JTable 的 JScrollPane 我想将这两个添加到 JFrame 中 我可以将 JPanel 添加到 JFrame 或将 JScro
  • Hibernate 本机查询 - char(3) 列

    我在 Oracle 中有一个表 其中列 SC CUR CODE 是 CHAR 3 当我做 Query q2 em createNativeQuery select sc cur code sc amount from sector cost
  • Java RMI - 客户端超时

    我正在使用 Java RMI 构建分布式系统 它必须支持服务器丢失 如果我的客户端使用 RMI 连接到服务器 如果该服务器出现故障 例如电缆问题 我的客户端应该会收到异常 以便它可以连接到其他服务器 但是当服务器出现故障时 我的客户端什么也
  • Spring RESTful控制器方法改进建议

    我是 Spring REST 和 Hibernate 的新手 也就是说 我尝试组合一个企业级控制器方法 我计划将其用作未来开发的模式 您认为可以通过哪些方法来改进 我确信有很多 RequestMapping value user metho

随机推荐