根据文件名的第一个字母对文件进行排序和计数

时间:2014-12-31 12:25:52

标签: java file sorting counting

假设用户输入目录 如何根据姓名的首字母对所有文件进行排序和计数?我想必须有一个比较器进行排序,但我不知道如何处理。

5 个答案:

答案 0 :(得分:1)

这样做的一个经典方法是使每个字母的地图成为一个键,并将该字母的数量设为值

List<String> names = new ArrayList<>();
Map<Character,Integer> map = new HashMap<>();
for (String name : names)
  {
  char firstLetter = name.charAt(0);
  if( map.containsKey(firstLetter) )
    map.put(firstLetter, map.get(firstLetter)+1 );
  else
    map.put(firstLetter, 1);
  }

答案 1 :(得分:1)

如果您使用的是,则有一种优雅的方法可以执行此操作:

import static java.util.stream.Collectors.counting;
import static java.util.stream.Collectors.groupingBy;

...

Map<Character, Long> countMap = Files.list(Paths.get("some/directory"))
                                     .filter(p -> !Files.isDirectory(p))
                                     .collect(groupingBy(p -> p.getFileName().toString().charAt(0), counting()));

它的作用是:

  • 从指定的目录
  • 获取Stream<Path>
  • 通过应用过滤获取文件
  • 收集Map<Character, List<Path>>中的每个文件,按其第一个字母分组
  • 计算每个List<Path>
  • 中的元素数量

答案 2 :(得分:0)

看一下this帖子,他们正在使用listFiles函数。然后,您就可以使用文件名计算并执行任何操作。我不认为现有的功能可以准确地检索出你需要的东西......

答案 3 :(得分:0)

使用Google Guava TreeMultiset可以轻松实现:

public static void main(String[] args) throws Exception {
    File dir = new File(*<directory>*);
    Multiset<Character> counts = TreeMultiset.create();
    for(File file: dir.listFiles()) {
        counts.add(file.getName().charAt(0));
    }
    System.out.println(counts);
}

答案 4 :(得分:0)

尝试类似:

File mydirectory = new File("c:\\users");
Map<Character, Integer> alpaCount = new HashMap<Character, Integer>();
Character firstChar;
Integer count;
for (File file : mydirectory.listFiles()) {
   firstChar = file.getName().charAt(0);
   count = alpaCount.get(firstChar);
   if (count == null) {
       alpaCount.put(firstChar, 1);
   } else {
       alpaCount.put(firstChar, count + 1);
   }
}