编写一个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);
}
}
答案 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操作之前计算时间,因为这是阻塞操作。