gpt4 book ai didi

java - 在 Java 中按名称排序文件不同于 Windows 资源管理器

转载 作者:搜寻专家 更新时间:2023-10-30 21:20:15 25 4
gpt4 key购买 nike

我有一个简单的 Java 程序,它读取文件目录并输出文件列表。我按名称对文件进行排序:

String [] files = dirlist.list();
files = sort(files);

我的问题是它按名称排序的方式与 Windows 资源管理器不同。

例如,如果我有这些文件:abc1.doc、abc12.doc、abc2.doc。

Java 会这样排序:

abc1.doc
abc12.doc
abc2.doc

当我在 Windows 资源管理器中打开文件夹时,我的文件排序如下:

abc1.doc
abc2.doc
abc12.doc

如何使 Java 像在 Windows 资源管理器中一样对文件进行排序?这是 Windows 的把戏吗?

最佳答案

Windows 资源管理器使用自己的算法。为了像 Explorer 一样对文件进行排序,您应该创建一个自定义比较器来完成这个技巧:

    public class WindowsExplorerStringComparator implements Comparator<String>
{
private String str1, str2;
private int pos1, pos2, len1, len2;

public int compare(String s1, String s2)
{
str1 = s1;
str2 = s2;
len1 = str1.length();
len2 = str2.length();
pos1 = pos2 = 0;

int result = 0;
while (result == 0 && pos1 < len1 && pos2 < len2)
{
char ch1 = str1.charAt(pos1);
char ch2 = str2.charAt(pos2);

if (Character.isDigit(ch1))
{
result = Character.isDigit(ch2) ? compareNumbers() : -1;
}
else if (Character.isLetter(ch1))
{
result = Character.isLetter(ch2) ? compareOther(true) : 1;
}
else
{
result = Character.isDigit(ch2) ? 1
: Character.isLetter(ch2) ? -1
: compareOther(false);
}

pos1++;
pos2++;
}

return result == 0 ? len1 - len2 : result;
}

private int compareNumbers()
{
int end1 = pos1 + 1;
while (end1 < len1 && Character.isDigit(str1.charAt(end1)))
{
end1++;
}
int fullLen1 = end1 - pos1;
while (pos1 < end1 && str1.charAt(pos1) == '0')
{
pos1++;
}

int end2 = pos2 + 1;
while (end2 < len2 && Character.isDigit(str2.charAt(end2)))
{
end2++;
}
int fullLen2 = end2 - pos2;
while (pos2 < end2 && str2.charAt(pos2) == '0')
{
pos2++;
}

int delta = (end1 - pos1) - (end2 - pos2);
if (delta != 0)
{
return delta;
}

while (pos1 < end1 && pos2 < end2)
{
delta = str1.charAt(pos1++) - str2.charAt(pos2++);
if (delta != 0)
{
return delta;
}
}

pos1--;
pos2--;

return fullLen2 - fullLen1;
}

private int compareOther(boolean isLetters)
{
char ch1 = str1.charAt(pos1);
char ch2 = str2.charAt(pos2);

if (ch1 == ch2)
{
return 0;
}

if (isLetters)
{
ch1 = Character.toUpperCase(ch1);
ch2 = Character.toUpperCase(ch2);
if (ch1 != ch2)
{
ch1 = Character.toLowerCase(ch1);
ch2 = Character.toLowerCase(ch2);
}
}

return ch1 - ch2;
}
}

现在,像这样使用它:

  Arrays.sort(files, new WindowsExplorerStringComparator());

关于java - 在 Java 中按名称排序文件不同于 Windows 资源管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3066742/

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