gpt4 book ai didi

Java:使用 Lambdas 识别 ArrayList 中的公共(public)路径

转载 作者:行者123 更新时间:2023-11-30 08:30:22 24 4
gpt4 key购买 nike

我得到了一个元素数组,例如:

ArrayList<String> t = new ArrayList();
t.add("/folder1/sub-folder1");
t.add("/folder2/sub-folder2");
t.add("/folder1/sub-folder1/data");

我需要将输出作为/folder1/sub-folder1,其中大部分是重复路径。

在 python 中,这可以使用以下函数实现:

   def getRepeatedPath(self, L):
""" Returns the highest repeated path/string in a provided list """
try:
pkgname = max(g(sorted(L)), key=lambda(x, v): (len(list(v)), -L.index(x)))[0]
return pkgname.replace("/", ".")
except:
return "UNKNOWN"

我正在尝试在 Java 中使用等效的 lambda 函数。我很震惊,需要一些关于 lambda 实现的帮助。

public String mostRepeatedSubString(ArrayList<String> pathArray) {
Collections.sort(pathArray);
String mostRepeatedString = null;
Map<String,Integer> x = pathArray.stream.map(s->s.split("/")).collect(Collectors.toMap());
return mostRepeatedString;
}

最佳答案

很多调整,但我终于明白了!

  public static void main(String[] args) {
ArrayList<String> t = new ArrayList<String>();
t.add("folder1/sub-folder1");
t.add("folder2/sub-folder2");
t.add("folder1/sub-folder1/data");
System.out.println(mostRepeatedSubString(t));
}

public static String mostRepeatedSubString(List<String> pathArray) {
return pathArray
.stream()
// Split to lists of strings
.map(s -> Arrays.asList(s.split("/")))
// Group by first folder
.collect(Collectors.groupingBy(lst -> lst.get(0)))
// Find the key with the largest list value
.entrySet()
.stream()
.max((e1, e2) -> e1.getValue().size() - e2.getValue().size())
// Extract that largest list
.map(Entry::getValue)
.orElse(Arrays.asList())
// Intersect the lists in that list to find maximal matching
.stream()
.reduce(YourClassName::commonPrefix)
// Change back to a string
.map(lst -> String.join("/", lst))
.orElse("");
}

private static List<String> commonPrefix(List<String> lst1, List<String> lst2) {
int maxIndex = 0;
while(maxIndex < Math.min(lst1.size(), lst2.size())&& lst1.get(maxIndex).equals(lst2.get(maxIndex))) {
maxIndex++;
}

return lst1.subList(0, maxIndex);
}

请注意,我必须从路径中删除初始的 /,否则该字符将在拆分中使用,导致每个路径列表中的第一个字符串为空字符串,这将始终是最常见的前缀。不过在预处理中执行此操作应该不会太难。

关于Java:使用 Lambdas 识别 ArrayList<String> 中的公共(public)路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41272392/

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