Java:Stringtokenizer到数组
给定一个多项式,我正试图编写代码来创建一个按次数的多项式,并将类似的项加在一起,例如。。。给定Java:Stringtokenizer到数组,java,arrays,int,polynomial-math,stringtokenizer,Java,Arrays,Int,Polynomial Math,Stringtokenizer,给定一个多项式,我正试图编写代码来创建一个按次数的多项式,并将类似的项加在一起,例如。。。给定 String term = "323x^3+2x+x-5x+5x^2" //Given What I'd like = "323x^3+5x^2-2x" //result 到目前为止,我已经用这个标记了给定的多项式 term = term.replace("+" , "~+"); term = term.replace("-", "~-"); System.out.print
String term = "323x^3+2x+x-5x+5x^2" //Given
What I'd like = "323x^3+5x^2-2x" //result
到目前为止,我已经用这个标记了给定的多项式
term = term.replace("+" , "~+");
term = term.replace("-", "~-");
System.out.println(term);
StringTokenizer multiTokenizer = new StringTokenizer(term, "~");
int numberofTokens = multiTokenizer.countTokens();
String[] tokensArray = new String[numberofTokens];
int x=0;
while (multiTokenizer.hasMoreTokens())
{
System.out.println(multiTokenizer.nextToken());
}
导致
323x^3~+2x~+x~-5x~+5x^2
323x^3
+2x
+x
-5x
+5x^2
我如何将系数从x值中分离出来,将每个系数保存在一个数组中,然后将度数放在一个不同的数组中,该数组的索引与其系数相同?然后我将使用此算法添加类似的术语
for (i=0;i<=biggest_Root; i++)
for(j=0; j<=items_in_list ; j++)
if (degree_array[j] = i)
total += b1[j];
array_of_totals[i] = total;
对于(i=0;i您还可以更新术语,使它们都具有系数:
s/([+-])x/\11/g
所以+x^2变成了+1x^2
您的单个系数可以通过简单的正则表达式提取出来。
这样的东西应该足够了:
/([+-]?\d+)x/ // match for x
/([+-]?\d+)x\^2/ // match for x^2
/([+-]?\d+)x\^3/ // match for x^3
/([+-]?\d+)x\^4/ // match for x^4
然后
其中“match”是正则表达式匹配的parseInt(特殊情况下,系数为1,并没有数字,例如+x)
这看起来像是一个家庭作业问题,所以我不会在这里透露全部答案,但这里是我如何开始的
public class Polynomial {
private String rawPolynomial;
private int lastTermIndex = 0;
private Map<Integer, Integer> terms = new HashMap<>();
public Polynomial(String poly) {
this.rawPolynomial = poly;
}
public void simplify() {
while(true){
String term = getNextTerm(rawPolynomial);
if ("".equalsIgnoreCase(term)) {
return;
}
Integer degree = getDegree(term);
Integer coeff = getCoefficient(term);
System.out.println(String.format("%dx^%d", coeff, degree));
terms.merge(degree, coeff, Integer::sum);
}
}
private String getNextTerm(String poly) {
...
}
private Integer getDegree(String poly) {
...
}
private Integer getCoefficient(String poly) {
...
}
@Override public String toString() {
return terms.toString();
}
}
您应该能够填空,希望这能有所帮助。如果您在某个地方遇到困难,我将很乐意进一步帮助您。使用“正则表达式”模式简化解析过程
(并使代码更酷、更简洁)
下面是一个工作示例,它根据您到目前为止解析的术语来解析每个术语的系数、变量和度。它只是将示例中显示的术语插入到字符串列表中,然后以相同的方式处理每个字符串
此程序运行并生成输出,如果您喜欢,可以将其拼接到您的程序中。要尝试:
$javac parse.java
$java解析
限制和潜在改进:
从技术上讲,系数和度数可以是分数,因此可以很容易地更改正则表达式以处理这些类型的数字。然后,可以使用Float.parseFloat()代替Integer.parseInt()将匹配的值转换为可以使用的变量
import java.util.*;
import java.util.regex.*;
public class parse {
public static void main(String args[]) {
/*
* Substitute this List with your own list or
* array from the code you've written already...
*
* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */
List<String>terms = new ArrayList<String>();
terms.add("323x^3");
terms.add("+2x");
terms.add("+x");
terms.add("-5x");
terms.add("+5x^2");
/* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
for (String term : terms) {
System.out.print("Term: " + term + ": \n");
Pattern pattern = Pattern.compile("([+-]*\\d*)([A-Za-z]*)\\^*(\\d*)");
Matcher matcher = pattern.matcher(term);
if (matcher.find()) {
int coefficient = 1;
try {
coefficient = Integer.parseInt(matcher.group(1));
} catch (Exception e) {}
String variable = matcher.group(2);
int degree = 1;
try {
degree = Integer.parseInt(matcher.group(3));
} catch (Exception e) {}
System.out.println(" coefficient = " + coefficient);
System.out.println(" variable = " + variable);
System.out.println(" degree = " + degree);
/*
* Here, do what you need to do with
* variable, coefficient and degree
*/
}
}
}
}
每个带括号的部分表示我要匹配并提取到结果中的术语的一部分。它将匹配的内容放入与括号集相对应的组中。第一组括号进入组1,第二组括号进入组2,以此类推
第一个匹配器(按()
分组)是([+-]*\\d*)
这是为了匹配(例如提取)系数(如果有的话)并将其放入第1组。它期望出现零个或多个“+”或“-”字符,后跟零个或多个数字。我可能应该用[+-]?\\d*
编写,它将匹配零个或一个+
或-
字符
下一个分组匹配器是([A-Za-z]*)
,表示匹配零个或多个大写或小写字母。
这是试图提取变量名(如果有的话)并将其放入组2中
接下来是一个未分组的\\^*
,它匹配0个或多个^
字符。它没有分组在括号中,因为我们想说明文本中的^
字符,但不想将其隐藏在任何地方。我们对它后面的指数非常感兴趣。注意:两个反斜杠是如何使Java字符串中的ne反斜杠。我们试图表示的实际正则表达式是\^*
。在这里对其进行转义的原因是^
unescaped在正则表达式中具有特殊意义,但我们只想匹配/允许在我们使用的代数术语中的该位置出现实际插入符号^
'您正在解析
最后一个图案组是(\\d*)
。在字符串文本之外,就像大多数在野外的正则表达式一样,那就是\d*
。它是转义的,因为默认情况下,在正则表达式中,d
,unscaped,意味着在文本的当前位置匹配一个文本d
,但是,转义的,\d
是一种特殊的正则表达式模式,匹配任何数字[0-9]
(正如javadoc解释的模式)。*
表示期望(匹配)零位或多位。或者,+
表示当前位置的文本中预期有1位或多位数字,?
表示当前位置的文本中预期有0位或1位数字。因此,基本上,最后一组是为匹配和提取指数(如果有)而设计的在可选插入符号之后,将该数字放入第3组
请记住,()
(括号中)分组只是为了我们可以将那些解析为单独组的区域提取出来
如果这些还不完全合理,那就学习一般的正则表达式,并在线阅读Java模式类javadoc。它们并不像第一眼看到的那么可怕,而且对于任何程序员来说都是一个非常有价值的研究,因为它跨越了最流行的脚本语言和编译器,所以只要学习一次,你就拥有了一个非常强大的Java模式类javadoc工具r life.我不能很好地理解你的问题。你能解释一下模式和匹配器是如何工作的吗?我对这一部分有点困惑,而且,如果一个数字没有任何变量,我该如何将变量设置为NULL?我更新了文本以解释我编写的代码是如何工作的。请阅读一般内容。然后找到使用模式获得更多帮助的Java示例代码。我认为如果省略x,匹配应该可以工作。请参阅上面我写的第2节中的描述。它设计为不允许变量名。最好的方法是编译它并进行实验。您可以更改代码中的术语,并根据模式javadocs使用正则表达式进行修改.祝你好运!令人惊讶的细节,我非常感谢你。最后一个问题,要将字符串标记器中的标记放入arraylist,是否像创建新的arraylist并循环执行术语一样简单。添加(StringTokenizer.next())
?只要StringTokenizer()返回
public class Polynomial {
private String rawPolynomial;
private int lastTermIndex = 0;
private Map<Integer, Integer> terms = new HashMap<>();
public Polynomial(String poly) {
this.rawPolynomial = poly;
}
public void simplify() {
while(true){
String term = getNextTerm(rawPolynomial);
if ("".equalsIgnoreCase(term)) {
return;
}
Integer degree = getDegree(term);
Integer coeff = getCoefficient(term);
System.out.println(String.format("%dx^%d", coeff, degree));
terms.merge(degree, coeff, Integer::sum);
}
}
private String getNextTerm(String poly) {
...
}
private Integer getDegree(String poly) {
...
}
private Integer getCoefficient(String poly) {
...
}
@Override public String toString() {
return terms.toString();
}
}
public class PolynomialTest {
@Test public void oneTermPolynomialRemainsUnchanged() {
Polynomial poly = new Polynomial("3x^2");
poly.simplify();
assertTrue("3x^2".equalsIgnoreCase(poly.toString()));
}
}
import java.util.*;
import java.util.regex.*;
public class parse {
public static void main(String args[]) {
/*
* Substitute this List with your own list or
* array from the code you've written already...
*
* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */
List<String>terms = new ArrayList<String>();
terms.add("323x^3");
terms.add("+2x");
terms.add("+x");
terms.add("-5x");
terms.add("+5x^2");
/* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
for (String term : terms) {
System.out.print("Term: " + term + ": \n");
Pattern pattern = Pattern.compile("([+-]*\\d*)([A-Za-z]*)\\^*(\\d*)");
Matcher matcher = pattern.matcher(term);
if (matcher.find()) {
int coefficient = 1;
try {
coefficient = Integer.parseInt(matcher.group(1));
} catch (Exception e) {}
String variable = matcher.group(2);
int degree = 1;
try {
degree = Integer.parseInt(matcher.group(3));
} catch (Exception e) {}
System.out.println(" coefficient = " + coefficient);
System.out.println(" variable = " + variable);
System.out.println(" degree = " + degree);
/*
* Here, do what you need to do with
* variable, coefficient and degree
*/
}
}
}
}
([+-]*\\d*)([A-Za-z]*)\\^*(\\d*)