我有50个不同长度和内容的字符串行的文本文件。我需要读取文件并按升序排序。排序条件:句子中以字母“a”开头的单词数。
public static void main(String[] args) throws FileNotFoundException {
String token1 = "";
Scanner inFile1 = new Scanner(new File("E:\\text.txt"));
List<String> temps = new LinkedList<String>();
inFile1.useDelimiter(". ");
while (inFile1.hasNext()) {
token1 = inFile1.nextLine();
temps.add(token1);
}
inFile1.close();
String[] tempsArray = temps.toArray(new String[0]);
for (int i = 0; i < tempsArray.length; i++) {
System.out.println(tempsArray[i]);
}
int cnt = 0; //number of words in the string line
for (int i=0; i<tempsArray.length; i++) {
int k=0; //number of words that start from the letter "а"
System.out.println("Line № = " + i);
StringTokenizer st = new StringTokenizer(tempsArray[i]);
while (st.hasMoreTokens()) {
cnt++;
String s= st.nextToken();
if (s.charAt(0)=='a') {
k++;
}
}
System.out.println("Number of words = " + cnt);
cnt=0;
System.out.println("Number of words 'а' = " + k);
}
}
我使用Map
作为Kau建议我。但Map
使用唯一键。但我的 K 可能具有相同的值,而Map
找不到合适的字符串元素。还有什么Сollection
我可以使用吗?
答案 0 :(得分:1)
我假设你已经有shell short的算法来排序整数数组。让方法为shellSort(int[] a)
。
您可以做的是创建一个地图,其中键为 k ,值为表示该行的字符串。与此同时,我们将创建一个包含所有 k 的整数数组。然后在 k 数组的数组上调用方法shellSort
。然后从排序的数组中读回,使用数组元素作为键在地图中查找。获取相应的地图值(即行)并在tempsArray
中逐个放回,最终应按所需方式对所有行进行排序。
下面是代码(未经测试)只是为了给出一个想法。
public static void main(String[] args) throws FileNotFoundException {
String token1 = "";
Scanner inFile1 = new Scanner(new File("E:\\text.txt"));
List<String> temps = new LinkedList<String>();
inFile1.useDelimiter(". ");
while (inFile1.hasNext()) {
token1 = inFile1.nextLine();
temps.add(token1);
}
inFile1.close();
String[] tempsArray = temps.toArray(new String[0]);
for (int i = 0; i < tempsArray.length; i++) {
System.out.println(tempsArray[i]);
}
int cnt = 0; //number of words in the string line
Map<Integer, List<String>> myMap = new HashMap<Integer, List<String>>();
int[] countArr = new int[tempsArray.length];
for (int i=0; i<tempsArray.length; i++) {
int k=0; //number of words that start from the letter "а"
System.out.println("Line № = " + i);
StringTokenizer st = new StringTokenizer(tempsArray[i]);
while (st.hasMoreTokens()) {
cnt++;
String s= st.nextToken();
if (s.charAt(0)=='a') {
k++;
}
}
countArr[i] = k;
List<String> listOfLines = myMap.get(k);
if(listOfLines == null){
listOfLines = new ArrayList<String>();
listOfLines.add(tempsArray[i]);
myMap.put(k, listOfLines);
} else{
listOfLines.add(tempsArray[i]);
}
System.out.println("Number of words = " + cnt);
cnt=0;
System.out.println("Number of words 'а' = " + k);
}
//Call shellsort here on the array of k values
shellSort(countArr);
List<String> sortedListOfLines = new ArrayList<String>();
for(int i=0; i<countArr.length; i++){
List<String> lineList = myMap.get(countArr[i]);
if(lineList != null){
sortedListOfLines.addAll(lineList);
lineList = null;
myMap.put(countArr[i], lineList);
}
}
}