在一行中更快地实现多个输入(Java)
这可能是个愚蠢的问题 我只是想更快地解决以下问题 我想在一行中输入三个整数,例如:在一行中更快地实现多个输入(Java),java,input,Java,Input,这可能是个愚蠢的问题 我只是想更快地解决以下问题 我想在一行中输入三个整数,例如: 10 34 54 一种方法是创建一个BufferedReader,然后使用readLine() 它将把整行读作一个字符串 然后我们可以使用StringTokenizer来分隔三个整数。(缓慢执行) 另一种方法是使用“Scanner”并通过nextInt()方法获取输入。(比以前的方法慢) 我想要一个快速的实现来接受这种类型的输入,因为我必须读取超过2000000行,而且这些实现非常慢 我的实施: Buffere
10 34 54
一种方法是创建一个BufferedReader,然后使用readLine()
它将把整行读作一个字符串
然后我们可以使用StringTokenizer来分隔三个整数。(缓慢执行)
另一种方法是使用“Scanner”并通过nextInt()方法获取输入。(比以前的方法慢)
我想要一个快速的实现来接受这种类型的输入,因为我必须读取超过2000000行,而且这些实现非常慢
我的实施:
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
for(i=0;i<n;i++) {
str=br.readLine();
st = new StringTokenizer(str);
t1=Integer.parseInt(st.nextElement().toString());
t2=Integer.parseInt(st.nextElement().toString());
z=Long.parseLong(st.nextElement().toString());
}
BufferedReader br=新的BufferedReader(新的InputStreamReader(System.in));
对于(i=0;i,这里有一个非常快速的基本示例:
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new FileReader("myfile.txt"));
String line;
while ((line = reader.readLine()) != null) {
for (String s : line.split(" ")) {
final int i = Integer.parseInt(s);
// do something with i...
}
}
reader.close();
}
然而,你的任务基本上需要时间
如果你在一个网站上这样做,并达到超时,你应该考虑在后台线程中进行,并向用户发送一个响应,说明数据正在被处理。你可能需要为用户添加一个检查进度的方式。
我只是想更快地解决以下问题
很可能你不需要更快的实现。说真的。即使是一个200万行的输入文件
机会在于:
- 处理文件的时间比读取文件的时间多,并且
- 大多数“读取时间”都花在操作系统级别上,或者只是等待下一个磁盘块被读取
我的建议是不要麻烦优化这个,除非整个应用程序运行时间太长。如果发现这种情况,请对应用程序进行概要分析,并使用概要统计数据告诉您哪些地方值得在优化上花费精力
(我的直觉是,优化应用程序的这一部分并没有什么好处。但不要依赖于此。对其进行分析!)以下是我所说的“专用扫描仪”的意思。根据解析器(或拆分器)的效率,这可能会快一点(可能不是):
BufferedReader br=新的BufferedReader(…);
对于(i=0;iHow slow?您可以发布一些您使用的示例代码以及计时吗?您可以使用BufferedReader并进行自己的解析,专门收集N个字符,直到看到空白或字符串结尾。这可能会更快。请注意,使用BufferedReader和更大的缓冲区,在所有情况下都可以获得更好的性能(10kB已经很有帮助了)。@SteveMcLeod我在一个编程网站上使用了这种方法,并且超过了时间限制。所以我认为有更好的方法来做。读取>200k的文本行并解析其中的三个整数总是不太理想。最好只做一次,然后存储一个二进制文件(流?)数据的版本,下次使用。@TheBlatone你能提供一个示例实现吗?我想你弄错了。每行包含三个整数。我会试试这个。但我认为它将提供与StringTokenizer相似的时间。通过编程网站,我指的是编程竞争(类似于TopCoder)@Android lol…来吧,发布你的代码和计时结果,我们会看看我们能为你做些什么。其他一切对我们来说都是一种冒险,是浪费时间。此外,Integer.parseInt将很难被更高效、更可读的东西取代。这可能是一个“字符串到数字的转换并不简单,而且需要相当长的时间”低估。即,可能是字符串拆分(或扫描仪使用)不是这里最大的性能差距。
BufferedReader br=new BufferedReader(...);
for(i=0;i<n;i++)
{
String str=br.readLine();
long[] resultLongs = {-1,-1,-1};
int startPos=0;
int nextLongIndex=0;
for (int p=0;p<str.length();p++)
{
if (str.charAt(p)== ' ')
{
String intAsStr=str.substring(startPos, p-1);
resultLongs[nextLongIndex++]=Integer.parseInt(intAsStr);
startpos=p+1;
}
}
// t1, t2 and z are in resultLongs[0] through resultLongs[2]
}