gpt4 book ai didi

java - 如何改进此 Java 代码以在字符串中查找子字符串?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:53:53 25 4
gpt4 key购买 nike

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

问题:在一个字符串中找到一个子字符串。

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."

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

最重要的要求是像编写生产代码一样编写它。

我的解决方案没有被接受。我怎样才能改进它?我知道,我可以使用:

  1. Knuth–Morris–Pratt algorithm
  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;
}
}

TestClass.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));

}
}

最佳答案

一些评论;

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

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

关于java - 如何改进此 Java 代码以在字符串中查找子字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3939561/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com