我正在try 从数组中获取唯一最长的公共子字符串元素信息.

String arr[] = { 
"/partA/partB/partC/value1",
"/partA/partB/partC/value2",
"/partD/partE/partF/value1",
"/partD/partE/partF/value2",
"/partG/partH/partI/value1",
"/partG/value2",
"/partJ/value1" 
}

在输入数组中,前两个元素是公共的,直到"/parta/partB/partC",所以我需要获取公共值.与WISE一样,第三个和第四个元素的公共值为"/partd/parte/partF",第五个和第六个元素的公共值为/partG,而第七个元素与其他元素没有任何公共值,因此它应该打印为"/partJ/value1".

[ "/partA/partB/partC",
  "/partD/partE/partF",
  "/partG",
  "/partJ/value1"
]

为此,我正在比较并try 找到最长的公共子字符串,如下所示,但无法获得所需的输出.

while(idx < s1.length() && idx < s2.length()){
        if(s1.charAt(idx) == s2.charAt(idx)){
            idx++;
        } else {
            break;
        }
     }
     s1.substring(0, idx);

推荐答案

您可以对所有路径进行标记化,循环遍历每条路径,并针对每条路径循环遍历其他路径.

只需在索引1处比较它们,然后向右搜索,直到它们不再匹配.将路径存储在集合内.

根据您想要的输出,您需要为前几部分中的每一部分提供一条公共路径,即partApartDpartGpartJ.

import java.util.*;
import java.util.stream.*;

public class LongestCommonPath {
  public static void main(String[] args) {
    String arr[] = {
        "/partA/partB/partC/value1", "/partA/partB/partC/value2",
        "/partD/partE/partF/value1", "/partD/partE/partF/value2",
        "/partG/partH/partI/value1", "/partG/value2",
        "/partJ/value1"
    };

    for (String path : longestCommonPaths(1, "/", arr)) {
      System.out.println(path);
    }
  }

  public static List<String> longestCommonPaths(int offset, String delimiter, String... paths) {
    Set<String> result = new LinkedHashSet<>();
    List<List<String>> tokenizedPaths = Stream.of(paths).map(path -> tokenizePath(path, delimiter)).collect(Collectors.toList());
    for (List<String> currPath : tokenizedPaths) {
      boolean found = false;
      for (List<String> otherPath : tokenizedPaths) {
        if (currPath != otherPath && currPath.get(offset).equals(otherPath.get(offset))) {
          result.add(commonPath(currPath, otherPath).stream().collect(Collectors.joining(delimiter)));
          found = true;
        }
      }
      if (!found) {
        result.add(currPath.stream().collect(Collectors.joining(delimiter)));
        found = false;
      }
    }
    return new ArrayList<>(result);
  }

  private static List<String> commonPath(List<String> path, List<String> otherPath) {
    int index = 0;
    while (index < path.size() && index < otherPath.size() && path.get(index).equals(otherPath.get(index))) {
      index++;
    }
    return path.subList(0, index);
  }

  private static List<String> tokenizePath(String path, String delimiter) {
    return Stream.of(path.split(delimiter)).collect(Collectors.toList());
  }
}

输出

/partA/partB/partC
/partD/partE/partF
/partG
/partJ/value1

Java相关问答推荐

我们如何直接使用kerminldap服务票证来通过ldap进行身份验证并形成LDAP上下文

当耗时的代码完成时,Circular ProgressIndicator显示得太晚

如何计算内循环的时间复杂度?

@从类文件中删除JsonProperty—Java

解析Javadoc时链接的全限定类名

扩展到弹出窗口宽度的JavaFX文本字段

Mapstruct不能正确/完全映射属性

按属性值从流中筛选出重复项

具有阻塞方法的开源库是否应该为执行提供异步选项?

生成桥方法以解决具有相同擦除的冲突方法

如何在构建Gradle项目时排除com.google.guava依赖项的一个变体

如何在Cosmos DB(Java SDK)中增加默认响应大小

当构造函数创建一个新实例时,Java为什么需要&new";

为什么项目名称出现在我的GET请求中?

为什么JavaFX MediaPlayer音频播放在Windows和Mac上运行良好,但在Linux(POPOS/Ubuntu)上却有问题?

如何将RESTAssured';S的Http标题转换为<;字符串、字符串和>的映射?

H2数据库仅支持%1个结果集?

无法在Java中获取ElastiCache的AWS CloudWatch指标

使用Java线程进行并行编程

JavaFX中ListView中的问题