递归方法不在TableView GUI(JavaFX)中递增字符串分析计数器

时间:2015-12-08 05:46:27

标签: uitableview recursion javafx

编辑计数器增量需要递归。

我有一个GUI,它将输入的字段添加到ListView,但也将对象的名称添加到旁边的TableView,并显示四个子字符串计数。它们是Plant对象,它应该显示在ListView中(它确实如此),然后在每次出现某个子字符串时显示名称:

见这里:

enter image description here

我不明白我错过了什么,因为在我的addButtonClick方法中,我调用了我的递归方法。这个逻辑对我来说在方法中是正确的,所以我必须在我的Integer属性或构造函数中遗漏一些东西。

这是Controller中添加按钮单击的方法。有一个组合框,用户可以选择Flower,Fungus,Weed或Herb。并且当用户点击相应的工厂类型时,出现与某些特征相关的相应单选按钮。所有这些都有效。我将展示代码的Flower部分:

    /*
Adds respective plant type and resets controls
 */
public void handleAddButtonClick(ActionEvent event) {
    if (idInput != null && nameInput != null & colorInput != null) {
        if (plantType.getValue().equals("Flower")) {
            Flower flower = new Flower(ID, idNum, name, color, smell, thorns, edible, poisonous, flavor, medicine, seasonal);
            flower.setID(idInput.getText());
            flower.setName(nameInput.getText());
            flower.setColor(colorInput.getText());
            flower.setSmell(scentedRadio.isSelected());
            flower.setThorns(thornyRadio.isSelected());
            observablePlantList.add(flower);

            //this is where the table information gets added.
            //it adds it, just displays 0's.

            flower.setPlantName(nameInput.getText());
            Plant.substringCounter(name, "e"); //tried flower instead
            Plant.substringCounter(name, "ar");//of Plant. still nothing.
            Plant.substringCounter(name, "er");
            Plant.substringCounter(name, "o");
            observableAnalysisList.add(flower);

            //just doing some debug printing. this prints 0 
            System.out.println(Plant.substringCounter(name, "e"));

            //more debugging. this prints fine because of toString() method
            System.out.println(flower);

这是主类和Flower类中的相关代码:

//Plant Table properties ("e", "o", "ar", "er")
public StringProperty plantName = new SimpleStringProperty(this, "plantName", "");
public String getPlantName() {return plantName.get(); }
public StringProperty plantNameProperty() {return plantName; }
public void setPlantName(String plantName) {this.plantName.set(plantName); }

public IntegerProperty countLetterE = new SimpleIntegerProperty(this, "countLetterE", 0);
public int getLetterE() {return countLetterE.get();}
public IntegerProperty eProperty() {return countLetterE; }
public void setCountLetterE(int countLetterE) {this.countLetterE.set(countLetterE);}

public IntegerProperty countLetterO = new SimpleIntegerProperty(this, "countLetterO", 0);
public int getLetterO() {return countLetterO.get(); }
public IntegerProperty oProperty() {return countLetterO; }
public void setCountLetterO(int countLetterO) {this.countLetterO.set(countLetterO);}

public IntegerProperty countLetterER = new SimpleIntegerProperty(this, "countLetterER", 0);
public int getLetterER() {return countLetterER.get(); }
public IntegerProperty erProperty() {return countLetterER; }
public void setCountLetterER(int countLetterER) {this.countLetterER.set(countLetterER);}

public IntegerProperty countLetterAR = new SimpleIntegerProperty(this, "countLetterAR", 0);
public int getLetterAR() {return countLetterAR.get(); }
public IntegerProperty arProperty() {return countLetterAR; }
public void setCountLetterAR(int countLetterAR) {this.countLetterAR.set(countLetterAR);}

递归方法:

public static int substringCounter(String plantName, String letters) {

    plantName = plantName.toLowerCase();

    if(plantName.isEmpty()) {
        return 0;
    }
    if(plantName.indexOf(letters) == -1) {
        return 0;
    }

    return 1 + substringCounter(plantName.substring(plantName.indexOf(letters) + 1), letters);
}
//toString method for Plant class to display in ListView. Works fine.
public String toString() {

    return "ID: " + this.ID + "-" + this.idNum + ", Name: " + this.name + ", Color: " + this.color;
}
}

花卉课程

    public class Flower extends Plant {

public Flower(String ID, int idNum, String name, String color, boolean smell, boolean thorns, boolean edible, boolean poisonous, boolean flavor, boolean medicine, boolean seasonal) {

    super(ID, idNum, name, color, smell, thorns, edible, poisonous, flavor, medicine, seasonal);

}
public void setSmell(boolean smell) {
    this.smell = smell;
}
public void setThorns(boolean thorns) {
    this.thorns = thorns;
}

//toString method for the ListView only. All works fine here

public String toString() {

    return super.toString() + ", Scent? " + this.smell + ", Thorns? " + this.thorns;
}

}

我真诚地希望我1)给你足够的信息,或2)没有给你太多的信息。谢谢大家的帮助。

1 个答案:

答案 0 :(得分:0)

你正在对一个字符串调用一个静态方法并返回一个数字,当你这样调用它时,它实际上没有任何结果:

Plant.substringCounter(name, "e");

如果你想要一些" action"你需要修改一个属性。或者至少处理substringCounter返回的结果。

此外,我不知道你为什么使用递归。这也是一样的:

String text = "dandelion";
String search = "d";

int count = 0;
int pos = 0;

if (!search.isEmpty()) {
    while ((pos = text.indexOf(search, pos)) != -1) {
        count++;
        pos++;
    }
}

System.out.println(count);

基本上是这样的:

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {

        HBox box = new HBox();
        box.setSpacing(10);

        TextField sourceTextField = new TextField( "Dandelion");
        Label result = new Label();
        TextField searchTextField = new TextField();

        // add listener for counting the number of substrings
        searchTextField.textProperty().addListener(new ChangeListener<String>() {

            @Override
            public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {

                String sourceText = sourceTextField.getText().toLowerCase();
                String searchText = newValue.toLowerCase();

                int count = 0;
                int pos = 0;

                if( !searchText.isEmpty()) {
                    while( (pos = sourceText.indexOf( searchText, pos)) != -1) {
                        count++;
                        pos++;
                    }
                }

                result.setText( String.valueOf(count));
            }
        });

        box.getChildren().addAll( new Label( "Search:"), searchTextField, new Label( "Text:"), sourceTextField, new Label( "Count:"), result);

        Scene scene = new Scene(box, 600, 200);
        primaryStage.setScene(scene);
        primaryStage.show();

    }

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

或者使用递归方法(顺便说一下,你还需要检查空字符串的字母):

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {

        HBox box = new HBox();
        box.setSpacing(10);

        TextField sourceTextField = new TextField( "Dandelion");
        Label result = new Label();
        TextField searchTextField = new TextField();
        searchTextField.textProperty().addListener(new ChangeListener<String>() {


            @Override
            public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {

                String sourceText = sourceTextField.getText().toLowerCase();
                String searchText = newValue.toLowerCase();

                result.setText( String.valueOf( substringCounter( sourceText, searchText)));
            }
        });

        box.getChildren().addAll( new Label( "Search:"), searchTextField, new Label( "Text:"), sourceTextField, new Label( "Count:"), result);

        Scene scene = new Scene(box, 600, 200);
        primaryStage.setScene(scene);
        primaryStage.show();


    }

    public static int substringCounter(String plantName, String letters) {

        plantName = plantName.toLowerCase();

        if(letters.isEmpty()) {
            return 0;
        }

        if(plantName.isEmpty()) {
            return 0;
        }

        if(plantName.indexOf(letters) == -1) {
            return 0;
        }

        return 1 + substringCounter(plantName.substring(plantName.indexOf(letters) + 1), letters);
    }

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

不是像我在示例中那样设置标签,您当然必须更改整数属性。