List和Map的嵌套
举个Map中嵌套List的例子
Map<Double, List<String>> height = new HashMap<>(); // 定义嵌套 // 既然是List,那么也要做初始化,不然会有NullPointerException height.put(165.5, new ArrayList<>()); height.put(170.0, new ArrayList<>()); height.put(175.5, new ArrayList<>()); height.put(180.0, new ArrayList<>()); // 往List里面添加元素 height.get(175.5).add("张三"); height.get(170.0).add("李四"); height.get(170.0).add("王五"); height.get(165.5).add("赵六");
输出
for (Double h : height.keySet()) { if (height.get(h).isEmpty()) continue; // 空List就不输出了 System.out.println(String.format("身高为%.1f的人有:", h)); height.get(h).forEach(System.out::println); }
List,Set,Map等等的互相嵌套都是一个套路,定义的时候做定义嵌套,使用时注意初始化,很方便。
自定义排序
参考博客:
Collections类中排序方法
Collections
中有内置sort
方法可以对List等容器进行排序。如果我想自定义排序规则呢?在C或C++中,自定义排序规则可以通过给sort
函数传递比较函数的函数指针实现。而在Java中,自定义排序规则通过给sort
函数传递比较类的实例来实现。Integer[] num = {100, 20, 10, 1, 1000, 500, 5, 600}; List<Integer> numList = Arrays.asList(num); Collections.sort(numList, new MyCompare()); numList.forEach(System.out::println);
这里的
MyCompare
是一个实现了Comparator
这个interface的类。规则是500以下的数升序排序,500及以上的数降序排序。class MyCompare implements Comparator<Integer> { @Override public int compare(Integer o1, Integer o2) { if (o1 >= 500 && o2 >= 500) { return o2.compareTo(o1); } return o1.compareTo(o2); } }
输出
程序输入
参考博客:
java.util.Scanner应用详解
从标准输入读取5个数字,排序后输出
List<Integer> numList = new ArrayList<>(); System.out.println("please input 5 numbers :"); Scanner in = new Scanner(System.in); for (int n = 5; n != 0; --n) { numList.add(in.nextInt()); } Collections.sort(numList); System.out.println("\nafter sort :"); displayList(numList);
输入和输出:
如果是要从文件内读取数字,只需改动
Scanner
的初始化部分:List<Integer> numList = new ArrayList<>(); File inFile = new File("test.txt"); Scanner in = new Scanner(inFile); for (int n = 5; n != 0; --n) { numList.add(in.nextInt()); } Collections.sort(numList); System.out.println("\nafter sort :"); displayList(numList);
test.txt内容为
11 22 44 33 2
,输出为:
当前目录的文件夹结构
参考博客:
Java文件操作大全
JAVA对文件和文件夹的操作
函数主体
/** * 递归显示文件夹结构 * * @param dir 文件夹路径,如C:\Program Files * @param indent 控制缩进,推荐0,1或2 */ private static void DirStructure(String dir, int indent) { File fp = new File(dir); // 递归边界条件 if (!fp.isDirectory()) { return; } // 获取文件和文件夹列表 File[] elemList = fp.listFiles(); if (elemList == null) { return; } for (File f : elemList) { // 通过indent控制缩进,输出占位符 for (int i = 0; i < indent; ++i) { System.out.print((i == indent - 1) ? "└---" : " "); } // 文件名 String fileName = f.getName(); System.out.print(fileName); // 文件夹结尾处加一个斜杠 System.out.println(f.isDirectory() ? "\\" : ""); // 获取绝对目录并递归 DirStructure(f.getAbsolutePath(), indent + 1); } }
调用
String dir = "C:\\Program Files\\Windows Mail"; System.out.println(String.format("directory of \"%s\" : ", dir)); System.out.println("----------------------------------------"); DirStructure(dir, 2);
输出
获取当前年月日
参考博客:
Java日期时间使用总结
代码,使用了
java.util.Calendar
和java.util.GregorianCalendar
库。Calendar now = new GregorianCalendar(); int year = now.get(Calendar.YEAR); int month = now.get(Calendar.MONTH); int day = now.get(Calendar.DAY_OF_MONTH); int hour = now.get(Calendar.HOUR_OF_DAY); int min = now.get(Calendar.MINUTE); int second = now.get(Calendar.SECOND); int millisecond = now.get(Calendar.MILLISECOND); String temp = "%d年%d月%d日,%d时%d分%d秒,%d毫秒"; System.out.println(String.format(temp, year, month, day, hour, min, second, millisecond));
输出