2014-01-08 35 views
0

嗨我想按照出现的降序从错误消息的用户输入文件进行排序。如何查找所有错误消息并按降序显示

input_file.txt

23545 debug code_to_debug 
43535 error check your code 
34243 error check values 
32442 run program execute 
24525 error check your code 

我想输出

error check your code 
error check values 

我当前的代码:

import java.io.*; 
import java.util.*; 

public class Sort { 

    public static void main(String[] args) throws Exception { 
     BufferedReader reader = new BufferedReader(new FileReader("fileToRead")); 
     Map<String, String> map=new TreeMap<String, String>(); 
     String line=""; 
     while((line=reader.readLine())!=null){ 
      map.put(getField(line),line); 
     } 
     reader.close(); 
     FileWriter writer = new FileWriter("fileToWrite"); 
     for(String val : map.values()){ 
      writer.write(val); 
      writer.write('\n'); 
     } 
     writer.close(); 
    } 

    private static String getField(String line) { 
     return line.split(" ")[0];//extract value you want to sort on 
    } 
} 
+0

你到目前为止的代码在哪里? –

+0

你可以使用Perl或红宝石?这是任何一种语言的3线程序。 – Gene

回答

0

将您的映射从<String, String>更改为<Integer, String>。然后,使用自定义Comparator来比较Integers从最小到最大。

看来您的错误消息按照从最严重到最不严重的整数值排列。这应该允许你使用这个事实。

+0

我不认为这会产生他们之后的输出......有一个“错误检查您的代码”与最高的整数值和第二低的整数值 –

+1

我认为(相当强烈),成为一个问题那么你放入地图。或者,有一个比较清晰的编号方案,比如那两个错误*应该*相等。 – Makoto

+0

是的,我同意,编号顺序似乎没有逻辑含义(可能对OP)。 –

0

而不是有一个Map<String,String>其中关键是整数值,你可以有关键作为错误消息,然后该值可以包含一个整数值的列表,所以当阅读文件时,它会变成类似的东西,也实现在地图比较命令他们:

Map<String, String> map = new TreeMap<String, List<String>>(new Comparator<String>() 
    { 
     @Override 
     public int compare(String s1, String s2) 
     { 
      //Implement a compare to get the order of string you want 
     } 
    } 
); 
String line = ""; 
while((line = reader.readLine()) != null) 
{ 
    String lineStr = line.split(" ")[1]; // get the message 
    List<String> vals = map.get(lineStr) // get the existing list 
    if(vals == null) 
      vals = new ArrayList<String>(); // create a new list if there isn't one 
    vals.add(getFeild(line));   // add the int value to the list 

    map.put(lineStr,vals);    // add to map 
} 

然后,您可以对列表进行排序成数字顺序,如果你想要的。此外,这将需要更多的工作来打印出地图 - 但这取决于格式

0

如果您只想对输入重新排序以便所有错误消息出现在顶部,则可以使用一种非常简单的方法它是这样的:

static String[] errorsToTop(String[] input) { 
    String[] output = new String[input.length]; 

    int i = 0; 
    for(String line : input) { 
     if(line.contains("error")) 
      output[i++] = line; 
    } 

    for(String line : input) { 
     if(!line.contains("error")) 
      output[i++] = line; 
    } 

    return output; 
} 

这只是复制数组首先与所有错误消息,然后将所有非错误消息。

虽然逻辑不太明显,但也可以使这两个循环成为嵌套循环。

static String[] errorsToTop(String[] input) { 
    String[] output = new String[input.length]; 

    int i = 0; 
    boolean not = false; 
    do { 
     for(String line : input) { 
      if(line.contains("error")^not) 
       output[i++] = line; 
     } 
    } while(not = !not); 

    return output; 
} 

目前还不清楚数字是否出现在您的输入文本文件中。如果他们不这样做,你可以使用startsWith代替contains

if(line.startsWith("error")) 

你也可以使用matches与像一个正则表达式:

if(line.matches("^\\d+ error[\\s\\S]*")) 

它说“打头的任意整数后跟一个空格,然后错误之后是什么也不是“。

0

由于没有答案已被标记,我会加2美分。 下面的代码适用于您发布的内容(也可能没有其他内容),它假定错误的数量高于非错误的数量,并且您根据时间片或某物抓取最多N行。

import java.util.NavigableMap; 
import java.util.TreeMap; 

public class SortDesc { 

    public static void main(String[] args) { 
    NavigableMap<Integer, String> descendingMap = new TreeMap<Integer, String>().descendingMap(); 
    descendingMap.put(23545, "debug code_to_debug"); 
    descendingMap.put(43535, "error check your code"); 
    descendingMap.put(34243, "error check values"); 
    descendingMap.put(32442, "run program execute"); 
    descendingMap.put(24525, "error check your code"); 

    System.out.println(descendingMap); 
    } 
} 

结果是这样的

{43535 =错误检查你的代码,34243 =错误校验值,32442 =运行程序执行,24525 =错误检查你的代码,23545 =调试code_to_debug}