字符串行按Shell排序排序

时间:2014-03-06 01:52:25

标签: java sorting

我有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我可以使用吗?

1 个答案:

答案 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);
       }
    }       
 }