【问题标题】:Java StringTokenizer and storing ArrayJava StringTokenizer 和存储数组
【发布时间】:2012-10-16 13:54:41
【问题描述】:

我已经编写了一个 Worker 类和 Worker 的驱动程序类。 我的工人阶级正在编译并显示所需的输出.. 但是在数组和 StringTokenizer 中我面临着主要问题......并且在 TestWorker.java32 行中有一个错误,我不知道它为什么会给出 问题是……

(i)声明一个数组,该数组可以存储最多 5 个使用数据(名称、workerID 和 hourlyRate)构造的 Worker 对象的引用。

(ii)现在允许用户重复输入workerID和小时,直到用户输入一个空字符串。读取这些值并在适当的对象上调用 addWeekly() 方法(通过搜索数组来定位具有指定 ID 的对象)。如果输入的 ID 不存在,则显示相应的错误消息。

(iii)计算并显示所有工人的工资

请在下面查看我的代码.....

//Worker.java

public class Worker { 
        public final double bonus=100;    
        protected String name, workerID;
        protected double hourlyRate, totalHoursWorked,tax,grossSalary,netSalary;

        public Worker(){

    }
public Worker(String name, String workerID, double hourlyRate){
    this.name = name;
    this.workerID = workerID;
    this.hourlyRate = hourlyRate;

    }

public void addWeekly(double hoursWorked){
    this.totalHoursWorked = this.totalHoursWorked + hoursWorked;
    }

public double gross(){
    grossSalary = (totalHoursWorked*hourlyRate);
            if(totalHoursWorked>=150){
        grossSalary = grossSalary +100;
        }
        return  grossSalary;
        }
public double netAndTax(){
    netSalary = grossSalary;
    if(grossSalary>500){
        tax = (grossSalary - 500) *0.3;
        netSalary = (grossSalary - tax);

    }
    return netSalary;
 }
public String getName(){
    return this.name;
}

public String getWorkerID(){
    return this.workerID;
}

public double getHourlyRate(){
    return this.hourlyRate;
}

public double getTotalHours(){
    return totalHoursWorked;
}

public double getGrossSalary(){
    return grossSalary;
    }

public void addToGross(double amt){
    grossSalary = grossSalary + amt;
}
public void displaySalary(){
    System.out.print("Name: " +getName() + "\nID :" + getWorkerID() 
            + "\nHourly Rate: " + getHourlyRate()+ "\nTotalHours Worked" + getTotalHours() + 
            "\nGross pay" + getGrossSalary() + "\nTax: " + netAndTax() + 
            "\nNet Pay: " + netAndTax());
}

}

//TestWorker.java

import java.util.Scanner;
import java.util.StringTokenizer;
public class TestWorker {
    public static void main(String args[]){
        Worker e = new Worker("John Major","s123",15.0);
        e.addWeekly(45);
        e.addWeekly(40);
        e.addWeekly(32);
        e.addWeekly(38);
        e.gross();
        e.netAndTax();
        e.displaySalary();

        Worker[] worklist = new Worker[5];
        worklist[0] = new Worker("Richard Cooper","s1235",20.0);
        worklist[1] = new Worker("John Major","s1236",18.0);
        worklist[2] = new Worker("Mary Thatcher","s1237",15.0);
        worklist[3] = new Worker("David Benjamin","s1238",16.0);
        worklist[4] = new Worker("Jack Soo","s1239",25.0);

    Scanner input = new Scanner(System.in);
    String name;
    double hourly;

    do{
        System.out.println("\n"); 
        System.out.print("Please Enter ID and hours-worked in a given week: ");
        name = input.nextLine();

        StringTokenizer string = new StringTokenizer(name,"+");
        String[] array  =new String[(string.countTokens)];
        for(int i=0;i<=4;i++){
            if(array[0].equals(worklist[0])){
            e.getName();
            e.getWorkerID();
            e.addWeekly(Double.parseDouble(array[0]));
            e.gross();
            e.displaySalary();

            }
            else if(array[0].equals(worklist[1])){
            e.getName();
            e.getWorkerID();
            e.addWeekly(Double.parseDouble(array[1]));
            e.gross();
            e.displaySalary();
            }

            else if(array[0].equals(worklist[2])){
            e.getName();
            e.getWorkerID();
            e.addWeekly(Double.parseDouble(array[2]));
            e.gross();
            e.displaySalary();
            }

            else if(array[0].equals(worklist[3])){
            e.getName();
            e.getWorkerID();
            e.addWeekly(Double.parseDouble(array[3]));
            e.gross();
            e.displaySalary();
            }

            else if(array[0].equals(worklist[4])){
            e.getName();
            e.getWorkerID();
            e.getHourlyRate();
            e.addWeekly(Double.parseDouble(array[4]));
            e.gross();
            e.displaySalary();
            }

            else{
            System.out.println("Please Enter correct information");
        }

     }

        System.out.println();
        while(string.hasMoreElements()){
            System.out.println(string.nextElement());
        }
    }
    while(name.isEmpty()==false);
    }

}

【问题讨论】:

  • 在 TestWorker 的第 32 行...错误 = 找不到符号并且...类型的非法开始

标签: java arrays object equals stringtokenizer


【解决方案1】:

首先,当 countTokens 实际上是这一行的方法时,您已将其指定为字段:

String[] array = new String[(string.countTokens)]; // Incorrect
String[] array = new String[(string.countTokens())]; // Correct

现在您似乎将输入拆分为+ 符号?因此,您应该输入类似于s123+12 的内容,这意味着ID s123 worked 12 hours this week。因此,为了解决类似的问题,您可能需要一个如下所示的循环:

Scanner input = new Scanner(System.in);

System.out.println("\n");
System.out.print("Please Enter ID and hours-worked in a given week: ");
String enteredString = input.nextLine();

while (!enteredString.isEmpty()) {
    StringTokenizer stringtok = new StringTokenizer(enteredString, "+");
    String id = stringtok.nextToken();
    Double hours = Double.parseDouble(stringtok.nextToken());

    for (int i = 0; i < 5; i++) {
        if (worklist[i].getWorkerID().equals(id)) {
            worklist[i].addWeekly(hours);
            break;
        }
    }

    System.out.println("\n");
    System.out.print("Please Enter ID and hours-worked in a given week: ");
    enteredString = input.nextLine();
}

for (int i = 0; i < 5; i++) {
    worklist[i].gross();
    worklist[i].netAndTax();
    worklist[i].displaySalary();
}

请记住,这非常粗略,根据您的说明,我并不完全清楚您要达到的目标。

【讨论】:

  • oo,我明白了,我的错误...非常感谢 Recurcive,昨天你也帮助了我...你真的帮了我...让我试一试
  • 我已经采用了你的一些代码,并在我的 1 中实现,它符合要求,但是,在 java.util.StringTokenizer.nextToken 的线程“main”java.util.NoSuchElementException 中给出此错误“异常” (StringTokenizer.java:349) 在 TestWorker2.main(TestWorker2.java:33)"
  • 你输入了什么?
【解决方案2】:

为什么不考虑String.split()name.split("\\+"),它会给你一个字符串数组

【讨论】:

  • 要求使用StringTokenizer的问题
  • 然后遍历StringTokenizer并在使用前先填充数组
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多