package com.zte.mds.web.service;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
class Solution {
public static void main(String[] args) throws IOException {
Map<String, String> map = new HashMap<>();
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
File file = new File(classLoader.getResource("test.text").getFile());
String data = FileUtils.readFileToString(file,"UTF-8");
String[] s = data.split(",");
for (String str : s) {
map.put(str,twelveDigits(str));
}
long[] arr = new long[s.length];
for (int i = 0; i < s.length; i++) {
arr[i] = Long.parseLong(twelveDigits(s[i]));
}
Arrays.sort(arr);
FileWriter fileWriter = new FileWriter("out.text");
for (long num : arr) {
List<String> strings = new ArrayList<>();
for (String key : map.keySet()) {
if (map.get(key).equals("0" + num+ "")) {
strings.add(key);
}
}
strings = sortStringSamePrefix(strings);
for (int i = 0; i < strings.size(); i++) {
fileWriter.write(strings.get(i) + ",");
}
}
fileWriter.close();
}
// 填充为12位数字
public static String twelveDigits(String s) {
while (s.length() != 12) {
s += "0";
}
return s;
}
public static List<String> sortStringSamePrefix (List<String> list) {
List<StringVal> tem = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
StringVal stringVal = new StringVal();
stringVal.setVal(list.get(i));
stringVal.setLength(list.get(i).length());
tem.add(stringVal);
}
List<String> res = new ArrayList<>();
List<StringVal> collect = tem.stream().sorted(Comparator.comparing(StringVal::getLength)).collect(Collectors.toList());
for (int i = 0; i < collect.size(); i++) {
res.add(collect.get(i).val);
}
return res;
}
// 前多少位相同将他们放在一起
public static List<List<String>> groupList(List<String> list, int len) {
List<List<String>> res = new ArrayList<>();
// 存放所有可能的前缀
Set<String> set = new HashSet<>();
for (int i = 0; i < list.size(); i++) {
String stri = list.get(i);
// 获取当前字符串的前缀
String pre = stri.substring(0,len);
// 判断字符串集合是否包含当前字符串
if (!set.contains(pre)) {
// 不包含则将其添加进去并新建List存放包含当前前缀的字符串
set.add(pre);
List<String> tem = new ArrayList<>();
tem.add(stri);
res.add(tem);
} else {
// 包含则说明之前已经存在相同前缀的字符串集合,由于数据都是经过排序的,所以直接取集合中最后一个集合,将数据添加进去即可
int length = res.size();
List<String> tem = res.get(length - 1);
tem.add(stri);
}
}
return res;
}
public static class StringVal{
private String val;
private int length;
public String getVal() {
return val;
}
public void setVal(String val) {
this.val = val;
}
public int getLength() {
return length;
}
public void setLength(int length) {
this.length = length;
}
}
}
排序部分代码
最新推荐文章于 2024-06-04 23:11:16 发布