如何改进该 Java 代码以查找字符串中的子字符串?

2023-11-25

最近,我被要求提交一份工作问题的解决方案。

Problem:在字符串中查找子字符串。

Input: "Little star's deep dish pizza sure is fantastic."  
Search: "deep dish pizza"  
Output: "Little star's [[HIGHLIGHT]]deep dish pizza[[ENDHIGHLIGHT]] sure is fantastic."

请注意,在此示例中,荧光笔不必具有完全相同的结果,因为you定义什么是好的代码片段,并返回最相关的代码片段,并突出显示查询术语。

最重要的要求是像我写一个生产代码.

我的解决方案没有被接受。我该如何改进它?我知道,我本可以使用:

  1. Knuth-Morris-Pratt 算法
  2. 正则表达式(我可以吗?)

我的问题:

  1. 科技公司在审查工作代码时会考虑什么。我当天就提交了代码,这有什么帮助吗?

  2. 它在其中一条评论中指出,它看起来像是学校代码而不是生产代码。如何?有什么建议么?

我的解决方案:
FindSubString.java

/**
 * FindSubString.java: Find sub-string in a given query
 * 
 * @author zengr
 * @version 1.0
 */

public class FindSubstring {
    private static final String startHighlight = "[[HIGHLIGHT]]";
    private static final String endHighlight = "[[ENDHIGHLIGHT]]";

    /**
     * Find sub-string in a given query
     * 
     * @param inputQuery: A string data type (input Query)
     * @param highlightDoc: A string data type (pattern to match)
     * @return inputQuery: A String data type.
     */
    public String findSubstringInQuery(String inputQuery, String highlightDoc) {
        try {

            highlightDoc = highlightDoc.trim();

            if (inputQuery.toLowerCase().indexOf(highlightDoc.toLowerCase()) >= 0) {
                // update query if exact doc exists
                inputQuery = updateString(inputQuery, highlightDoc);
            }

            else {
                // If exact doc is not in the query then break it up
                String[] docArray = highlightDoc.split(" ");

                for (int i = 0; i < docArray.length; i++) {
                    if (inputQuery.toLowerCase().indexOf(docArray[i].toLowerCase()) > 0) {
                        inputQuery = updateString(inputQuery, docArray[i]);
                    }
                }
            }
        } catch (NullPointerException ex) {
            // Ideally log this exception
            System.out.println("Null pointer exception caught: " + ex.toString());
        }

        return inputQuery;
    }

    /**
     * Update the query with the highlighted doc
     * 
     * @param inputQuery: A String data type (Query to update)
     * @param highlightDoc: A String data type (pattern around which to update)
     * @return inputQuery: A String data type.
     */
    private String updateString(String inputQuery, String highlightDoc) {
        int startIndex = 0;
        int endIndex = 0;

        String lowerCaseDoc = highlightDoc.toLowerCase();
        String lowerCaseQuery = inputQuery.toLowerCase();

        // get index of the words to highlight
        startIndex = lowerCaseQuery.indexOf(lowerCaseDoc);
        endIndex = lowerCaseDoc.length() + startIndex;

        // Get the highlighted doc
        String resultHighlightDoc = highlightString(highlightDoc);

        // Update the original query
        return inputQuery = inputQuery.substring(0, startIndex - 1) + resultHighlightDoc + inputQuery.substring(endIndex, inputQuery.length());
    }

    /**
     * Highlight the doc
     * 
     * @param inputString: A string data type (value to be highlighted)
     * @return highlightedString: A String data type.
     */
    private String highlightString(String inputString) {
        String highlightedString = null;

        highlightedString = " " + startHighlight + inputString + endHighlight;

        return highlightedString;
    }
}

测试类.java

/**
 * TestClass.java: jUnit test class to test FindSubString.java
 * 
 * @author zengr
 * @version 1.0
 */

import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;

public class TestClass extends TestCase
{
    private FindSubstring simpleObj = null;
    private String originalQuery = "I like fish. Little star's deep dish pizza sure is fantastic. Dogs are funny.";

    public TestClass(String name) {
        super(name);
    }

    public void setUp() { 
        simpleObj = new FindSubstring();
    }

    public static Test suite(){

        TestSuite suite = new TestSuite();
        suite.addTest(new TestClass("findSubstringtNameCorrect1Test"));
        suite.addTest(new TestClass("findSubstringtNameCorrect2Test"));
        suite.addTest(new TestClass("findSubstringtNameCorrect3Test"));
        suite.addTest(new TestClass("findSubstringtNameIncorrect1Test"));
        suite.addTest(new TestClass("findSubstringtNameNullTest"));

        return suite;
    }

    public void findSubstringtNameCorrect1Test() throws Exception
    {
        String expectedOutput = "I like fish. Little star's deep [[HIGHLIGHT]]dish pizza[[ENDHIGHLIGHT]] sure is fantastic. Dogs are funny.";
        assertEquals(expectedOutput, simpleObj.findSubstringInQuery(originalQuery, "dish pizza"));
    }

    public void findSubstringtNameCorrect2Test() throws Exception 
    {
        String expectedOutput = "I like fish. Little star's [[HIGHLIGHT]]deep dish pizza[[ENDHIGHLIGHT]] sure is fantastic. Dogs are funny.";
        assertEquals(expectedOutput, simpleObj.findSubstringInQuery(originalQuery, "deep dish pizza"));
    }

    public void findSubstringtNameCorrect3Test() throws Exception 
    {
        String expectedOutput = "Hello [[HIGHLIGHT]]how[[ENDHIGHLIGHT]] are [[HIGHLIGHT]]you[[ENDHIGHLIGHT]]r?";
        assertEquals(expectedOutput, simpleObj.findSubstringInQuery("Hello how are your?", "how you"));
    }

    public void findSubstringtNameIncorrect1Test() throws Exception 
    {
        String expectedOutput = "I like fish. Little star's deep dish pizza sure is fantastic. Dogs are funny.";
        assertEquals(expectedOutput, simpleObj.findSubstringInQuery(originalQuery, "I love Ruby too"));
    }

    public void findSubstringtNameNullTest() throws Exception
    {
        String expectedOutput = "I like fish. Little star's deep dish pizza sure is fantastic. Dogs are funny.";
        assertEquals(expectedOutput, simpleObj.findSubstringInQuery(originalQuery, null));

    }
}

一些评论;

  • 您只需突出显示first搜索字符串的出现。
  • 您假设小写匹配没问题。除非将其指定为要求,否则最好提供两种方法,一种尊重大小写,另一种忽略大小写。
  • 我可能会检查给定的参数,如果其中任何一个为空,则抛出 NPE。这将是我的方法所做的第一件事。我会在 javadoc 中清楚地记录这种行为。
  • 你的方法名称不好;findSubstringInQuery主要任务不是寻找,而是突出显示inQuery部分是多余的。只需调用该方法即可highlight或者可能highlightIgnoreCase如果你打算有一个highlight尊重案例。
  • 您的方法参数名称不好。我已经查看了您的方法签名 10 次,但仍然需要查看方法主体来提醒自己哪个 arg 是搜索项以及哪个是要搜索的文本。给他们打电话searchTerm and text.
  • 生产代码不使用默认包。
  • 生产代码不使用System.out.println().
  • 你的 javadoc 需要改进,它需要告诉用户一切他们需要了解代码。
  • 我会考虑对没有类变量的类使用静态方法。
  • 我还会考虑允许用户指定他们自己的开始和结束突出显示标记(如果我这样做,我不会使用静态方法)。
  • 我不会trim()除非这是明确要求的。如果我这样做了,那么显然这种行为将记录在 javadoc 中。

我不会担心用于搜索的算法,Knuth-Morris-Pratt 看起来不错,但他们不应该期望你了解它并实现它,除非工作规范特别要求在字符串搜索方面的经验/专业知识。

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

如何改进该 Java 代码以查找字符串中的子字符串? 的相关文章

随机推荐

  • 在 yii2 中使用限制范围?

    我想使用从数据库获取数据限制 12 20 这是我的代码 Query new Query Query gt select um id as USERid um first name um last name um email COUNT g
  • 如何在git中查看旧版本的文件夹

    我需要从原点提取更改 问题是其中一个库已更新到最新版本 它使我的应用程序部分崩溃 我想提取最近的更改 然后返回到仅一个文件夹的先前 或特定 版本 其中包含导致该问题的 lib txt 文件 有什么办法可以做到这一点吗 git checkou
  • setMethod("$<-") 和 set setReplaceMethod("$") 有什么区别?

    Question 当编程时r与s4面向对象系统 当一个人必须使用setReplaceMethod 我不明白与setMethod添加时 lt 到函数的名称 做setMethod lt and setReplaceMethod 是平等的吗 文档
  • C# 中“get”和“set”属性的用途是什么

    我看到一些 get set 方法来设置值 谁能告诉我这样做的目的吗 public string HTTP USER NAME get return UserName set UserName value public string HTTP
  • TensorFlow 2.0 [条件 x == y 不按元素成立:]

    我正在使用 TensorFlow 2 和 Keras 训练国际象棋程序 以前 如果我在与模型训练相同的脚本中加载数据 我就可以完成这项工作 但随着数据集变得更大 腌制数据然后重新加载它会更快 当我这样做时 即使将模型修剪到一层以简化问题 我
  • 在 Node.js 中使用串口进行异步/等待

    使用 Node js 致力于 PC 和基于 Arduino 的硬件之间的通信 最后一个设备是用 G 代码实现的 所以如果我发送 G0 我将收到两行 一个用于确认已收到指令 第二个用于确认数据 我想使用 async await 但出了点问题
  • CORS:为什么我成功获得了预检选项,但发布后仍然出现 CORS 错误? [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 目前不接受答案 我有一个使用 axios 发出 http 请求的 Vue 前端 以及一个使用express 的 Node 后端 它们位于不同的域 本地运行时 BE端口是3080 FE端口是3
  • 为什么Java中的private static field = new Singleton不懒呢?

    我读了很多关于 Singleton 的文章 其中大多数作者都说 Java 中 Singleton 的这种变体 public class Singleton private static Singleton instance new Sing
  • 在某个元素之前添加元素

    我有这个代码 td div class imagebutton abc div td 我想在这段代码中添加另一个元素 如下所示 p blablablalblablab p td div class imagebutton abc div t
  • 如何判断 Perl 脚本是否在 CGI 上下文中执行?

    我有一个 Perl 脚本 它将从命令行作为 CGI 运行 从 Perl 脚本中 我如何知道它是如何运行的 最好的选择是检查GATEWAY INTERFACE环境变量 它将包含服务器正在使用的 CGI 协议的版本 这几乎总是CGI 1 1 T
  • 使用 VB 6 代码从任务管理器结束进程

    我需要粗略地终止一个应用程序 以便我可以在我的数据库中获得该应用程序的幻像订阅者 这不能通过关闭应用程序来产生 手动地 如果我们从任务管理器终止应用程序 幻影订阅者将存在 现在我需要在 VB 6 代码中自动完成它 帮助 谢谢 有两种方法 S
  • 使用 download.file() 从 HTTPS 下载文件

    我想使用 R 读取在线数据download file 如下所示 URL lt https d396qusza40orc cloudfront net getdata 2Fdata 2Fss06hid csv download file UR
  • C(非 C++)有限域(伽罗瓦域)线性代数库

    我正在寻找一个有限域 伽罗瓦域C 的精确线性代数库 C 是不可接受的 因为我需要能够编写一个 Haskell 绑定到它 这显然是C 很难 我找到了类似的图书馆FFLAS FFPACK and Givaro但这些是 C 模板库 In part
  • 地址清理程序不适用于 Windows 上的 bash

    目前在 Windows 上的 Ubuntu Bash 上运行 llvm clang clang format 和 clang modernize 我想使用谷歌发布的一套清理工具 包括地址 内存和线程清理 fsanitize 选项似乎都不起作
  • 将字符串转换为 long long

    我正在使用 VS 2008 创建一个 C DLL 非托管 项目 我需要将 char 转换为 long long 类型 有简单的方法吗 提前致谢 最简单的方法是使用 std stringstream 它也是最类型安全的 std strings
  • 兼容类型和参数类型限定符

    这两个声明的类型是否兼容 void f char char void f char restrict char restrict 或类似 void g char void g char const 我很难在标准中找到涵盖该问题的任何内容 我
  • Dropwizard HK2注射液

    我对使用 dropwizard 还很陌生 目前我正在尝试实现 HK2 依赖注入 这在资源内部工作得很好 但在资源外部却不起作用 这是我正在做的事情 Client client new JerseyClientBuilder environm
  • 输入特征以获得默认参数提升

    免责声明 我知道这个问题的答案 我认为这可能会引起一些普遍的兴趣 问题 我们怎样才能拥有一种类型特征 能够产生由执行而产生的类型默认参数促销 动机 我希望能够可移植地使用变量参数 例如 void foo char const fmt Ple
  • ASP MVC C#:是否可以将动态值传递到属性中?

    好吧 我对 C 很陌生 我正在尝试使用 ASP MVC2 创建一个小网站 我想创建我自己的授权属性 但如果可能的话 我需要传递一些值 例如 CustomAuthorize GroupID Method Parameter public Ac
  • 如何改进该 Java 代码以查找字符串中的子字符串?

    最近 我被要求提交一份工作问题的解决方案 Problem 在字符串中查找子字符串 Input Little star s deep dish pizza sure is fantastic Search deep dish pizza Ou