Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:Stringtokenizer到数组_Java_Arrays_Int_Polynomial Math_Stringtokenizer - Fatal编程技术网

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*)