原题链接:
https://leetcode.cn/problems/find-duplicate-file-in-system/description/
完成情况:
解题思路:
这段代码的作用是在给定的路径数组中查找重复的文件内容,并将具有相同内容的文件放在同一个List链表中。通过使用Map来实现Key-Value映射,其中Key是文件内容,Value是文件路径。代码首先创建一个空的结果列表result和一个空的Map对象map。然后遍历路径数组paths,将每个路径拆分为路径和文件名及其内容。接着检查Map中是否已存在相同内容的文件,如果存在则将其放入结果列表中。最后返回结果列表result。
分隔一下-----------------------------------------------------------------------------
在 Java 字符串中,为了表示左括号 (
作为一个普通字符而非正则表达式中的特殊字符,我们需要使用转义字符来告诉 Java 这是一个字面意义上的左括号。
由于正则表达式中左括号 (
有特殊的含义(用于分组),如果直接使用 (
,正则表达式引擎会将其解释为一个分组的开始,而不是字面含义上的左括号。要在正则表达式中使用字面含义上的左括号,我们需要在其前面加上转义字符 \
,这样正则表达式引擎就会知道接下来的字符是作为普通字符对待。
然而,由于在 Java 字符串中反斜杠 \
本身也是一个转义字符,表示特殊字符或控制序列(如 \n
表示换行,\t
表示制表符等)。所以,要在 Java 字符串中表示一个字面上的反斜杠,我们需要写作 \\
。这个反斜杠的双重表示确保了当字符串被解析为正则表达式时,正则表达式引擎接收到的是 \(
,一个转义了的左括号。
因此,当我们在 Java 的字符串中写 \\(
时:
- 第一个
\\
被 Java 字符串解析器解读为一个普通的反斜杠\
。 - 当字符串作为正则表达式被解析时,这个
\(
会被识别为一个字面值上的左括号。
所以,最终我们使用双反斜杠 \\
来在正则表达式中正确地表示一个普通的左括号 (
。
参考代码:
_609在系统中查找重复文件
package leetcode板块;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class _609在系统中查找重复文件 {
/**
* 请你按路径返回文件系统中的所有重复文件。答案可按 任意顺序 返回。
* @param paths
* @return
*/
public List<List<String>> findDuplicate(String[] paths) {
/* TODO: 通俗翻译就是,这道题需要将括号内,内容相同的字符串,放在同一个List<String>链表里
Map -> Key--Value映射
*/
List<List<String>> result = new ArrayList<List<String>>();
Map<String,List<String>> map = new HashMap<String,List<String>>(); //K: 是文件内容 V:是文件路径
for (String path:paths){ //主要考察文件需要逐个分类处理好
//每个path又要主要里面存在的【space】区分
String [] aloneFile = path.split(" "); //里面包含路径,以及路径下的各个文件名及其内容
// root/a 1.txt(abcd) 2.text(efgh)
//再去每一个单独的文件,划出出来它的k和v
for (int i = 1;i < aloneFile.length;i++){ //aloneFile[0]必然是文件路径
String [] name_count = aloneFile[i].split("\\(");
name_count[1] = name_count[1].replace(")","");
List<String> list = map.getOrDefault(name_count[1],new ArrayList<String>());
list.add(aloneFile[0] + "/" + name_count[0]);
map.put(name_count[1],list);
}
}
for (String key : map.keySet()){
if (map.get(key).size() > 1){
result.add(map.get(key));
}
}
return result;
}
}