java某公司现需要统计员工出勤次数,具体要求如下: 输入样例: Mark Tom Ivor Mark Ivor Mark Jack end 输入样例解释: 每行表示某天出勤的员工名单,以空格间隔。 end表示输入结束 输出样例: Mark 3 Ivor 2 Tom 1 Jack 1 输出样例解释: 按出勤天数倒序输出,若出勤次数相同则按输入顺序输出(即先输入的先输出,样例中Tom比Jack先输入,因此先输出Tom)。每名员工占一行,格式为员工名+空格+出勤次数
时间: 2024-03-19 07:45:37 浏览: 93
员工出勤情况统计表(DOC格式).doc
以下是Java代码实现:
```java
import java.util.*;
public class Main {
public static void main(String[] args) {
Map<String, Integer> attendance = new HashMap<>(); // 员工出勤次数字典
Scanner scanner = new Scanner(System.in);
while (true) {
String line = scanner.nextLine();
if (line.equals("end")) {
break;
}
String[] names = line.split(" ");
for (String name : names) {
attendance.put(name, attendance.getOrDefault(name, 0) + 1); // 统计员工出勤次数
}
}
// 按照出勤次数倒序排序并输出结果
List<Map.Entry<String, Integer>> sortedAttendance = new ArrayList<>(attendance.entrySet());
Collections.sort(sortedAttendance, new Comparator<Map.Entry<String, Integer>>() {
@Override
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
if (o1.getValue().equals(o2.getValue())) {
return Integer.compare(getInputOrder(o1.getKey()), getInputOrder(o2.getKey())); // 若出勤次数相同则按输入顺序输出
}
return -Integer.compare(o1.getValue(), o2.getValue()); // 按出勤次数倒序排序
}
});
for (Map.Entry<String, Integer> entry : sortedAttendance) {
System.out.println(entry.getKey() + " " + entry.getValue());
}
}
// 获取员工名字在输入中的位置
private static int getInputOrder(String name) {
Scanner scanner = new Scanner(System.in);
int order = 0;
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
if (line.equals("end")) {
break;
}
order++;
if (line.contains(name)) {
return order;
}
}
return -1; // 没有找到员工名字
}
}
```
与Python实现类似,我们使用了一个 `attendance` 字典来统计每个员工出勤次数。在输入时,我们使用 `Scanner` 来读取每行输入,然后使用 `String` 类的 `split` 方法将一行输入按照空格分割成员工名单数组,遍历每个员工名字,使用字典的 `getOrDefault` 方法来统计该员工出现的次数,并将其存储到 `attendance` 字典中。
在输出时,我们使用 `ArrayList` 来将 `attendance` 字典中的每个键值对转换成一个 `Map.Entry` 对象,并使用 `Collections.sort` 方法对其进行排序。在排序时,我们传入一个 `Comparator` 对象,该对象首先按照出勤次数倒序排序,若出勤次数相同则按照输入顺序输出,这里我们定义了一个 `getInputOrder` 方法来获取员工名字在输入中的位置。
注意,在 `getInputOrder` 方法中,我们还是使用了 `Scanner` 来读取输入,这里需要注意的是,由于 `System.in` 是标准输入流,而标准输入流只能读取一次,因此在 `getInputOrder` 方法中,我们不能再次读取标准输入流,需要将输入作为方法参数传递。
阅读全文