java - 检查一个字符串是否与另一个字符串相似

标签 java string

我做了一些研究,发现一些主题会检查字符串是否是字符串中的子字符串,并选择与指定字符串最接近的字符串,但是如何检查一个字符串是否类似于另一个并提供正确/错误的响应?即:

String 1: JAVA IS A PROGRAMMING LANGUAGE
String 2: JAVA IS A PROGRAMMING LANGUAG X

这将返回“true”

String 1: JAVA IS A PROGRAMMING LANGUAGE
String 2: I ATE THE CAKE

这将返回“false”

谢谢。

最佳答案

你问的问题有点不简单。您答案的核心是另一个问题:

How do you define "similar"?

您需要指定一些管理此问题的规则,以及与这些规则相关的一些阈值,我不确定您是否已经考虑过。

例如,下面是一个简单的解决方案(在美观或效率上请对我宽容一些,我只是很快地将其组合在一起,因此代码可能有点困惑......我更关心回答问题...如果你愿意,你可以自己重构它)。有一个阈值 %75,在该阈值中,我检查较小字符串中的字符数是否与较大字符串中的字符数匹配最多 %75%(注意:java.lang.String 是最终的,因此无法扩展它) :

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;

public class MyString{
  private static final float THRESHOLD = (float) 0.75;

  private final Logger logger = Logger.getLogger(MyString.class.getName());

  private String str;
  private Map <Character, Integer> strMap;

  public MyString(String str){ //java.lang.String is final...
    this.str = str;
    this.strMap = this.generateCharMap(str);
  }

  public void executeTestForSophiaZhuang(){
    {
      MyString str1 = new MyString("JAVA IS A PROGRAMMING LANGUAGE");
      String str2 = "JAVA IS A PROGRAMMING LANGUAG X";
      logger.log(Level.INFO, "String {0}.isSimilar({1}) == {2}", new Object[]{
        str1.toString(), str2, str1.isSimilar(str2)});
    }
    {
      MyString str1 = new MyString("JAVA IS A PROGRAMMING LANGUAG X");
      String str2 = "JAVA IS A PROGRAMMING LANGUAGE";
      logger.log(Level.INFO, "String {0}.isSimilar({1}) == {2}", new Object[]{
        str1.toString(), str2, str1.isSimilar(str2)});
    }
    {
      MyString str1 = new MyString("JAVA IS A PROGRAMMING LANGUAGE");
      String str2 = "I ATE THE CAKE";
      logger.log(Level.INFO, "String {0}.isSimilar({1}) == {2}", new Object[]{
        str1.toString(), str2, str1.isSimilar(str2)});
    }
    {
      MyString str1 = new MyString("I ATE THE CAKE");
      String str2 = "JAVA IS A PROGRAMMING LANGUAGE";
      logger.log(Level.INFO, "String {0}.isSimilar({1}) == {2}", new Object[]{
        str1.toString(), str2, str1.isSimilar(str2)});
    }
  }

  @Override
  public String toString(){
    return this.str;
  }

  private Map <Character, Integer> generateCharMap(String str){
    Map <Character, Integer> map = new HashMap<>();
    Integer currentChar;
    for(char c: str.toCharArray()){
      currentChar = map.get(c);
      if(currentChar == null){
        map.put(c, 1);
      } else {
        map.put(c, currentChar+1);
      }
    }
    return map;
  }

  public boolean isSimilar(String compareStr){
    Map <Character, Integer> compareStrMap = this.generateCharMap(compareStr);
    Set <Character> charSet = compareStrMap.keySet();
    int similarChars = 0;
    int totalStrChars = this.str.length();
    float thisThreshold;

    if(totalStrChars < compareStrMap.size()){
      totalStrChars = compareStr.length();
    }

    Iterator it = charSet.iterator();
    char currentChar;
    Integer currentCountStrMap;
    Integer currentCountCompareStrMap;
    while(it.hasNext()){
      currentChar = (Character)it.next();
      currentCountStrMap = strMap.get(currentChar);
      if(currentCountStrMap != null){
        currentCountCompareStrMap = compareStrMap.get(currentChar);
        if (currentCountCompareStrMap >= currentCountStrMap){
          similarChars += currentCountStrMap;
        } else {
          similarChars += currentCountCompareStrMap;
        }
      } 
    }

    thisThreshold = ((float) similarChars)/((float) totalStrChars);
    Logger.getLogger(MyString.class.getName()).log(Level.INFO, "similarChars: {0}, totalStrChars: {1}, thisThreshold: {2}", new Object[]{similarChars, totalStrChars, thisThreshold});
    if(thisThreshold > THRESHOLD){
      return true;
    }
    return false;
  }
}

我认为您想要做的是在尝试定义 isSimilar 方法之前定义相似的方法。

关于java - 检查一个字符串是否与另一个字符串相似,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26446348/

相关文章:

Python将字符串拆分为多个带有单引号和尾随逗号的子字符串

Python:通过替换其符号来创建字符串的所有派生词

java - 不推荐使用的 API 和旧版 API 之间的区别?

java - 如何在 Java 中比较字符串?

java - 将弯音发送到 Java 中的 MIDI 音序器

java - 调试Spring配置不起作用

java - 删除字符串中所有以 "http"开头的单词?

c# - 如何为 string.Format 设置命名参数?

java - 如何改变SearchView的样式?

java - 带有嵌套 if else 语句的字符串连接