Java 解析字符串数组的双元素
我正试图编写一个Java程序来分析文本文件中字符串数组中的每个字符串,如果数字解析为双精度,程序将打印前面的单词和后面的单词。我似乎不知道如何解析字符串数组的每个元素。目前它只打印第一个数字和后面的单词,而不打印前面的单词。希望有人能帮忙 我的文本文件如下: 假设49个人正在切一块蛋糕,把它分给5个人。我给自己切了一大块,占33.3% 一块蛋糕。现在轮到你切一块蛋糕了。你还会切一块33.3%的蛋糕吗?或者你会吗 公平一点,把剩下的66.6%的蛋糕分成4个均匀的部分?你要切多大的一片 这是我的代码:Java 解析字符串数组的双元素,java,Java,我正试图编写一个Java程序来分析文本文件中字符串数组中的每个字符串,如果数字解析为双精度,程序将打印前面的单词和后面的单词。我似乎不知道如何解析字符串数组的每个元素。目前它只打印第一个数字和后面的单词,而不打印前面的单词。希望有人能帮忙 我的文本文件如下: 假设49个人正在切一块蛋糕,把它分给5个人。我给自己切了一大块,占33.3% 一块蛋糕。现在轮到你切一块蛋糕了。你还会切一块33.3%的蛋糕吗?或者你会吗 公平一点,把剩下的66.6%的蛋糕分成4个均匀的部分?你要切多大的一片 这是我的代码
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import javax.swing.JOptionPane;
public class NumberSearch {
public static void main(String args[]) throws FileNotFoundException {
//creating File instance to reference text file in Java
// String filedirect = JOptionPane.showInputDialog(null, "Enter your file");
File text = new File("cakeQuestion2.txt");
//Creating Scanner instance to read File in Java
Scanner scnr = new Scanner(text);
//Reading each line of file using Scanner class
int lineNumber = 1;
while(scnr.hasNextLine())
{
String line = scnr.nextLine();
lineNumber++;
//Finding words
String[] sp = line.split(" +"); // "+" for multiple spaces
for (int i = 1; i < sp.length; i++)
{
{
double d = Double.parseDouble(sp[i]);
// System.out.println(+ d);
if (isDouble(sp[i]))
{
// have to check for ArrayIndexOutOfBoundsException
String surr = (i-2 > 0 ? " " + sp[i-2]+" " : "") +
sp[i] +
(i+1 < sp.length ? " "+sp[i+1] : "");
System.out.println(surr);
}
}}
}
}
public static boolean isDouble( String str )
{
try{
Double.parseDouble( str );
return true;
}
catch( Exception e ){
return false;
}}}
Suppose 49 are
between 5 people.
of 33.3 percent
a 33.3 percent
remaining 66.6 percent
into 4 even
导入java.io.File;
导入java.io.FileNotFoundException;
导入java.util.Scanner;
导入javax.swing.JOptionPane;
公共类编号搜索{
公共静态void main(字符串args[])引发FileNotFoundException{
//在Java中创建引用文本文件的文件实例
//String filedirect=JOptionPane.showInputDialog(null,“输入文件”);
文件文本=新文件(“cakeQuestion2.txt”);
//在Java中创建扫描仪实例以读取文件
扫描仪编号=新扫描仪(文本);
//使用Scanner类读取文件的每一行
int lineNumber=1;
while(scnr.hasNextLine())
{
String line=scnr.nextLine();
lineNumber++;
//找词
String[]sp=line.split(“+”);/“+”用于多个空格
对于(int i=1;i0?“+sp[i-2]+”“:”)+
sp[i]+
(i+1
Mmmmm。。。您的代码对于任务来说似乎过于冗长和复杂
检查此代码段:
public static void main(String args[]) throws FileNotFoundException {
String line = "Suppose 49 are slicing a cake to divide it between 5 people. I cut myself a big slice, consisting of 33.3 percent of the whole cake. Now it is your turn to cut a slice of cake. Will you also cut a 33.3 percent slice? Or will you be fairer and divide the remaining 66.6 percent of the cake into 4 even parts? How big a slice will you cut?";
String[] sp = line.split(" +"); // "+" for multiple spaces
final String SPACE = " ";
// loop over the data
for (int i = 0; i < sp.length; i++) {
try {
// if exception is not raised, IS A DOUBLE!
Double.parseDouble(sp[i]);
// if is not first position print previous word (avoid negative index)
if (i > 0)
System.out.print(sp[i - 1] + SPACE);
// print number itself
System.out.print(sp[i] + SPACE);
// if is not last position print previous word (avoid IOOBE)
if (i < sp.length - 1)
System.out.print(sp[i + 1]);
// next line!
System.out.println();
} catch (NumberFormatException ex) {
// if is not a number, not our problem!
}
}
}
我认为使用try-catch将是一项昂贵的操作。跟着这个。使用
regex
将更加优雅。stringsurr=(i-2>0?“+sp[i-2]+”:”)+sp[i]+(i+1三元运算符的目的是帮助提高可读性。您需要使用StringBuilder将其分解为单独的位,因为它不是那么容易阅读。我看到的一个明显错误是for循环条件。您需要以int i=0开始循环parseDouble
不是enugh,因为20将解析为double,但它是一个整数而不是double,可以使用Seal建议的正则表达式,也可以使用不同的方法。还有一件事,索引代码的检查很难看,+1表示指南针,我认为i-2
应该是i-1
,因为你可能是指上一个单词,它是1步而不是2步,对吗?@vinay是的,现在我知道op为什么用i-2表示上一个单词了?!for循环应该从0开始?@Ma3x如果第一个单词是45.6怎么办?它仍然是额外的工作吗?在这种情况下是额外的迭代,如果数据是动态检索的,则是。Double.parseDouble(sp[i])代码>还不够吗<代码>Double.parseDouble(30)代码>将通过,但它不是双重的?@GavinColl你解决了你的问题??只要你从来没有标记一个答案,如你所接受的,你必须知道这个或任何答案已经解决了你的问题,请考虑通过点击复选标记接受它。这向更广泛的社区表明,你已经找到了一个解决方案,并给回答者和你自己带来了一些声誉。没有义务这样做。