在 Java 中拆分字符串后尝试使用循环进行方法调用

Trying to use a loop to make a method call after splitting a string in Java

提问人:mat515 提问时间:11/16/2023 最后编辑:Abramat515 更新时间:11/17/2023 访问量:66

问:

我正在编写一个实现链表的程序,以便从文件中读取多项式并将它们放入链表节点中。我现在已经从文件中读取了多项式,将它们拆分为系数和指数。现在,我的任务是找到一种方法来调用创建节点的类中的添加函数。此函数采用两个整数作为参数。如何编写采用这两个术语并调用方法而不会遇到错误的代码?常量没有指数,只有系数。Polynomial

最终目标是调用创建节点的方法。此方法接受两个整数作为参数,即多项式中每个项的系数和指数。

这是我目前的方法。我在循环的某些区域写了一些打印语句,以更好地理解程序中各个地方发生的事情。main

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class Proj2 {

    public static void main(String[] args) {
        Polynomial list1 = new Polynomial();
        File file = new File("polynomials.txt");
        try (BufferedReader br = new BufferedReader(new FileReader(file))) {
            String line;
            while ((line = br.readLine()) != null) {
                String[] term = line.split("[+]");
                for (int i = 0; i < term.length; i++) {
                    while (term[i] != null) {
                        String[] s3 = term[i].split("[ ^//x]");
                        for (int u = 0; u < s3.length; u++) {
                            System.out.println(s3[u]);

                            // put the data into the polynomial class starting here with the add
                            // method
                            // constants get an exponent of 0 and monomials get an exponent of 1 see
                            // email
                            System.out.println("each element of the polynomial is divided here");
                            // Integer r = Integer.getInteger(s3.toString());
                            // System.out.println(r);
                        }
                        System.out.println("each term is divided here");
                        break;
                    }
                }
                System.out.println("each line/polynomial is divided here");
            }
        }
        catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        catch (NumberFormatException e) {
            e.printStackTrace();
        }
    }
}

以下是程序正在读取的文件:

4x^2+2x^1+3
5x^3+15
2x^2+2x^1+5

我尝试了几种不同的循环,几种将 s 转换为 s 的不同方法,例如:StringInteger

Integer r = Integer.getInteger(s3.toString());

并作为参数传递给我的方法调用,但我无法弄清楚如何以一种有意义的方式进行迭代,或者截至目前,甚至无法找到一种除 null 值之外的相等任何值的方法。任何帮助将不胜感激。rr

Java 字符串

评论

0赞 Deadron 11/16/2023
您发布的代码并没有尝试执行您的帖子所谈论的任何事情。如果您将问题缩小到特定问题,而不是看起来像整个家庭作业,那将有很大帮助。
0赞 Tim Roberts 11/16/2023
你认为这有什么作用?split("[ ^//x]")
0赞 mat515 11/16/2023
@Daedron我想在格式为'poly.add(s3[u], s3[u]);的第二个for循环中添加一个方法调用,其中参数是系数。我想澄清我的问题是如何使用循环来填充方法调用的参数?关于拆分,我希望它将字符串拆分为由 ^ 和 x 字符分隔的数字。最好的问候,任何意见都会很棒。

答:

0赞 Abra 11/16/2023 #1

你走在正确的轨道上。
首先需要将 [polynomial] 字符串拆分为项,其中项由加号分隔,即 .
请注意,这是一个正则表达式元字符,因此当您想将多项式的字符串拆分为项时,您需要对其进行转义。
++

拆分为项后,您希望从每个项中提取系数和指数。
系数是 之前的数字,指数是 之后的数字。当然,术语可能不包含,也可能不包含,因此您也需要处理这些情况。
在下面的代码中,我使用方法 indexOf 来定位系数和指数,然后使用方法子字符串来提取它们。
xx^x^

我不熟悉类,所以我假设它是你写的类,但是我在你的问题中找不到该类的代码,所以我写了自己的。在下面的代码中,是一个单向链表,其中列表中的每个节点都是类(这是我写的另一个类)的实例,并且 a 同时包含系数和指数。PolynomialPolynomialTermTerm

在下面的代码中,我从文本文件中读取一行,将其拆分为项,从每个项中提取系数和指数,创建一个实例并将其添加到实例中。
以下代码中的语句仅用于调试目的。
TermPolynomialprint

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;

public class Proj2 {
    public static void poly() {
        try (BufferedReader br = Files.newBufferedReader(Paths.get("polynomials.txt"))) {
            String line = br.readLine();
            while (line != null) {
                Polynomial polynomial = new Polynomial();
                System.out.println(line);
                String[] terms = line.split("\\+");
                System.out.println(Arrays.toString(terms));
                boolean first = true;
                for (String term : terms) {
                    int begin = term.indexOf('^');
                    int exp;
                    if (begin > 1) {
                        exp = Integer.parseInt(term.substring(begin + 1));
                    }
                    else {
                        exp = 0;
                    }
                    int start = term.indexOf('x');
                    int coeff;
                    if (start == 0) {
                        coeff = 1;
                    }
                    else if (start > 0) {
                        coeff = Integer.parseInt(term.substring(0, start));
                    }
                    else {
                        coeff = Integer.parseInt(term);
                    }
                    if (first) {
                        first = false;
                    }
                    else {
                        System.out.print(", ");
                    }
                    System.out.printf("%d|%d", coeff, exp);
                    Term t = new Term(coeff, exp);
                    polynomial.addTerm(t);
                }
                System.out.println();
                System.out.println(polynomial);
                line = br.readLine();
            }
        }
        catch (IOException xIo) {
            xIo.printStackTrace();
        }
    }

    public static void main(String[] args) {
        poly();
    }
}

class Term {
    private final int  coefficient;
    private final int  exponent;
    private Term  next;

    public Term(int coeff, int exp) {
        coefficient = coeff;
        exponent = exp;
    }

    public Term getNext() {
        return next;
    }

    public void setNext(Term term) {
        next = term;
    }

    public String toString() {
        return String.format("%dx^%d%s",
                             coefficient,
                             exponent,
                             (next != null ? "+" : ""));
    }
}

class Polynomial {
    private Term  start;

    public void addTerm(Term term) {
        if (start == null) {
            start = term;
        }
        else {
            Term temp = start.getNext();
            Term last = start;
            while (temp != null) {
                last = temp;
                temp = temp.getNext();
            }
            last.setNext(term);
        }
    }

    public String toString() {
        StringBuilder sb = new StringBuilder();
        Term temp = start;
        while (temp != null) {
            sb.append(temp);
            temp = temp.getNext();
        }
        return sb.toString();
    }
}

以下是在问题中使用示例多项式文件时的输出。

4x^2+2x^1+3
[4x^2, 2x^1, 3]
4|2, 2|1, 3|0
4x^2+2x^1+3x^0
5x^3+15
[5x^3, 15]
5|3, 15|0
5x^3+15x^0
2x^2+2x^1+5
[2x^2, 2x^1, 5]
2|2, 2|1, 5|0
2x^2+2x^1+5x^0

评论

0赞 mat515 11/17/2023
非常感谢你!!这确实帮助我理解了如何将两个整数值放入方法调用中,同时将所有内容保持在循环中。我真的很感激这个!
0赞 Abra 11/17/2023
@mat515您可以通过接受我的回答或投赞成票(或两者兼而有之)来表达您的感激之情。
1赞 Reilas 11/16/2023 #2

"...我怎样才能编写采用这两个术语并调用方法的代码......”

创建一个来保存每个多项式项

随后,创建一个静态方法来分析术语

class Polynomial {
    BigDecimal coefficient;
    BigInteger power;

    static Polynomial parse(String s) {
        Polynomial p = new Polynomial();
        int i = s.indexOf('^');
        if (i == -1) p.coefficient = new BigDecimal(s);
        else {
            if (i != 1) p.coefficient = new BigDecimal(s.substring(0, i - 1));
            p.power = new BigInteger(s.substring(i + 1));
        }
        return p;
    }
}

从这里开始,使用二维 LinkedList 来包含每个多项式表达式

LinkedList<LinkedList<Polynomial>> l = new LinkedList<>();
String f = "polynomials.txt";
try (BufferedReader r = new BufferedReader(new FileReader(f))) {
    String s;
    LinkedList<Polynomial> t;
    while ((s = r.readLine()) != null) {
        t = new LinkedList<>();
        for (String v : s.split("[+*-]")) t.add(Polynomial.parse(v));
        l.add(t);
    }
}

输出

coefficient = 4, power = 2
coefficient = 2, power = 1
coefficient = 3, power = null

coefficient = 5, power = 3
coefficient = 15, power = null

coefficient = 2, power = 2
coefficient = 2, power = 1
coefficient = 5, power = null

评论

0赞 mat515 11/17/2023
非常感谢你!!!我真的很感谢你的帮助,尤其是在解析字符串时,我发现它很复杂。再次感谢!
0赞 Reilas 11/17/2023
谢谢@Abra,我添加了一个 i != 1 检查。