采访编码Java排序

时间:2012-06-21 04:41:40

标签: java

编写一个java程序来读取文件中的输入,然后对每个单词中的字符进行排序。完成后,按升序对所有生成的单词进行排序,最后跟随文件中数值的总和。

  • 处理数据时删除特殊字符和停用字词
  • 测量执行代码所需的时间

让我们说文件的内容是:Sachin Tendulkar获得了18111次ODI运行和14692次测试运行。

输出:achins adeklnrtu adn cdeors dio estt nrsu nrsu 32803

拍摄时间:3毫秒

My Code需要15毫秒才能执行.....

请建议我解决这个问题的任何快速方法............

代码:

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.*;

public class Sorting {

    public static void main(String[] ags)throws Exception
    {
        long st=System.currentTimeMillis();
        int v=0;
        List ls=new ArrayList();
        //To read data from file
        BufferedReader in=new BufferedReader(
                 new FileReader("D:\\Bhive\\File.txt"));
        String read=in.readLine().toLowerCase();
        //Spliting the string based on spaces
        String[] sp=read.replaceAll("\\.","").split(" ");
        for(int i=0;i<sp.length;i++)
        {
            //Check for the array if it matches number
            if(sp[i].matches("(\\d+)"))
                //Adding the numbers
                v+=Integer.parseInt(sp[i]);
            else
            {
                //sorting the characters
                char[] c=sp[i].toCharArray();
                Arrays.sort(c);
                String r=new String(c);
                //Adding the resulting word into list
                ls.add(r);
            }
        }
        //Sorting the resulting words in ascending order
        Collections.sort(ls);
        //Appending the number in the end of the list
        ls.add(v);
        //Displaying the string using Iteartor
        Iterator it=ls.iterator();
        while(it.hasNext())
            System.out.print(it.next()+" ");
        long time=System.currentTimeMillis()-st;
        System.out.println("\n Time Taken:"+time);
    }
}

5 个答案:

答案 0 :(得分:5)

使用indexOf()从字符串中提取单词,而不是split(" ")。它提高了性能。

请参阅此主题:Performance of StringTokenizer class vs. split method in Java

此外,尝试增加输出的大小,复制粘贴行 Sachin Tendulkar得分18111 ODI运行和14692测试运行。在文本文件中50,000次并测量性能。这样,当您尝试不同的优化时,您将能够看到相当大的时间差异。

修改

测试了此代码(使用.indexOf()

        long st = System.currentTimeMillis();
        int v = 0;
        List ls = new ArrayList();
        // To read data from file
        BufferedReader in = new BufferedReader(new FileReader("D:\\File.txt"));
        String read = in.readLine().toLowerCase();
        read.replaceAll("\\.", "");
        int pos = 0, end;
        while ((end = read.indexOf(' ', pos)) >= 0) {
            String curString = read.substring(pos,end);
            pos = end + 1;
        // Check for the array if it matches number
            try {
                // Adding the numbers
                v += Integer.parseInt(curString);
            }
            catch (NumberFormatException e) {
                // sorting the characters
                char[] c = curString.toCharArray();
                Arrays.sort(c);
                String r = new String(c);
                // Adding the resulting word into TreeSet
                ls.add(r);
            }
        }
        //sorting the list
        Collections.sort(ls);
        //adding the number
        list.add(v);
        // Displaying the string using Iteartor 
        Iterator<String> it = ls.iterator();
        while (it.hasNext()) {
            System.out.print(it.next() + " ");
        }
        long time = System.currentTimeMillis() - st;
        System.out.println("\n Time Taken: " + time + " ms");

在文件中使用1行的效果
您的密码:3毫秒
我的代码:2毫秒

在文件中使用50K行的效果
您的密码:45毫秒
我的代码:32毫秒

如您所见,当输入大小增加时,差异很大。请在您的机器上测试并分享结果。

答案 1 :(得分:3)

我唯一看到的是:以下一行是不必要的昂贵:

   System.out.print(it.next()+" ");

那是因为print is inefficient, due to all the flushing going on.而是使用字符串构建器构造整个字符串,然后减少到一次打印调用。

答案 2 :(得分:1)

我删除了列表并仅使用Arrays读取它,在我的机器中使用代码将代码设置为6毫秒,使用数组只需要4到5毫秒。在您的机器中运行此代码,让我知道时间。

import java.io.BufferedReader;

import java.io.FileReader;

import java.util.*;

public class Sorting {
public static void main(String[] ags)throws Exception
{
    long st=System.currentTimeMillis();
    int v=0;
    //To read data from file
    BufferedReader in=new BufferedReader(new FileReader("File.txt"));
    String read=in.readLine().toLowerCase();
    //Spliting the string based on spaces
    String[] sp=read.replaceAll("\\.","").split(" ");
    int j=0;
    for(int i=0;i<sp.length;i++)
    {
        //Check for the array if it matches number
        if(sp[i].matches("(\\d+)"))
            //Adding the numbers
            v+=Integer.parseInt(sp[i]);
        else
        {
            //sorting the characters
            char[] c=sp[i].toCharArray();
            Arrays.sort(c);
            read=new String(c);
            sp[j]= read;
            j++;
        }
    }
    //Sorting the resulting words in ascending order
    Arrays.sort(sp);
    //Appending the number in the end of the list
    //Displaying the string using Iteartor
    for(int i=0;i<j; i++)
        System.out.print(sp[i]+" ");
        System.out.print(v);
    st=System.currentTimeMillis()-st;
    System.out.println("\n Time Taken:"+st);
}

}

答案 3 :(得分:1)

我使用PriorityQueue而不是List运行相同的代码。另外,正如nes1983建议的那样,首先构建输出字符串,而不是单独打印每个单词,这有助于减少运行时间。

这些修改后的运行时间肯定会减少。

答案 4 :(得分:0)

我已经通过包含@Teja逻辑进一步修改了这样的代码,并在2毫秒内产生了1毫秒:

long st=System.currentTimeMillis();
     BufferedReader in=new BufferedReader(new InputStreamReader(new FileInputStream("D:\\Bhive\\File.txt")));
     String read= in.readLine().toLowerCase();
     String[] sp=read.replaceAll("\\.","").split(" ");
     int v=0;
     int len = sp.length;
     int j=0;
     for(int i=0;i<len;i++)
     {
            if(isNum(sp[i]))
             v+=Integer.parseInt(sp[i]);
             else
            {
              char[] c=sp[i].toCharArray();
              Arrays.sort(c);
              String r=new String(c);
              sp[j] = r;
              j++;
             }
      }
        Arrays.sort(sp, 0, len);
        long time=System.currentTimeMillis()-st;
        System.out.println("\n Time Taken:"+time);
        for(int i=0;i<j; i++)
        System.out.print(sp[i]+" ");
        System.out.print(v); 

编写小实用程序来执行检查字符串包含数字而不是正则表达式:

private static boolean isNum(String cs){
     char [] s = cs.toCharArray();
     for(char c : s)
     {
      if(Character.isDigit(c))
       {
         return true;
       }
     }
     return false;
 }

在调用System.out操作之前计算时间,因为这是阻塞操作。