1

我想列出所有以“Reda”结尾的名称并忽略区分大小写,我已经尝试了toString底部方法中的条件,但它不会打印任何东西。

public class Customer {

    public static void main(String[] args) throws IOException {

        File a = new File("customer.txt");
        FileWriter v = new FileWriter(a);
        BufferedWriter b = new BufferedWriter(v);
        PrintWriter p = new PrintWriter(b);

        human Iman = new human("Iman", 5000);
        human Nour = new human("Nour", 3500);
        human Redah = new human("Redah", 0);
        human iman = new human("iman", 200);
        human MohamedREDA = new human("MohamedREDA", 3000);
        human Mohamed_Redah = new human("Mohamed Redah", 2000);

        human[] h = new human[6];

        h[0] = Iman;
        h[1] = Nour;
        h[2] = Redah;
        h[3] = iman;
        h[4] = MohamedREDA;
        h[5] = Mohamed_Redah;

        p.println(Iman);
        p.println(Nour);
        p.println(Redah);
        p.println(iman);
        p.println(MohamedREDA);
        p.println(Mohamed_Redah);

        p.flush();
    }

}

class human {
    public String name;
    public double balance;

    public human(String n, double b) {
        this.balance = b;
        this.name = n;
    }

    @Override
    public String toString() {

        if (name.equalsIgnoreCase("Reda") && (name.equalsIgnoreCase("Reda"))) {
            return name + " " + balance;
        } else
            return " ";
    }
}
4

6 回答 6

1

请避免将条件放入toString方法中。删除那里的条件

public String toString() {
    return name + " " + balance;
}

Customer并在课堂上改变你的逻辑

human[] h = new human[6];

h[0] = Iman;
h[1] = Nour;
h[2] = Redah;
h[3] = iman;
h[4] = MohamedREDA;
h[5] = Mohamed_Redah;

for (int i = 0; i < h.length; i++) {
    if (h[i].name.toLowerCase().endsWith("reda")) { // condition here
        p.println(h[i]);
    }
}

并利用loops不要重复代码行。在您手动编写行的每个地方。

检查Java String 类并使用所需的方法添加条件。

于 2013-06-22T16:13:41.043 回答
0

你不应该把这样的条件放在toString()方法原因中,它没有正确地将业务应用程序逻辑放在这个方法中。

toString()是对象的字符串表示。

您可以做的是在调用之前放置条件toString(),或者helper为此创建一个方法。

private boolean endsWithIgnoringCase(String other){
 return this.name.toLowerCase().endsWith(other.toLowerCase()); 
}
于 2013-06-22T16:17:49.870 回答
0
String redahname = ("Redah").toLowerCase();   //put your h[0] instead of ("Redah")

        if(name.endsWith("redah")){ //IMPORTANT TO BE IN LOWER CASE, (it is case insenitive this way)
            //your code here if it ends with redag
            System.out.println(redahname);
        } //if it does not end with "redah" it wont out print it!

你可以使用这个,但你能解释一下你的问题吗?你到底需要什么?

于 2013-06-22T16:23:30.210 回答
0

尝试这个

   @Override
    public String toString() {

        if (name.toLowerCase().endsWith("reda"))) {
            return name + " " + balance;
        } else
            return " ";
    }
于 2013-06-22T16:23:32.820 回答
0
  1. human忽略大小写,没有调用您的 s Reda,因此您观察到没有打印的名称是正常工作逻辑的表现。

  2. 您的条件是多余的:您执行两次相同的测试:

    name.equalsIgnoreCase("Reda") && (name.equalsIgnoreCase("Reda"))
    
  3. 如果您只需要匹配字符串结尾,则应使用正则表达式:

    name.matches("(?i).*reda")
    
  4. toString是为所有对象定义的通用方法。以你的方式使用它,只为一个特殊的用例烘焙业务逻辑,是不正确的。您必须重写代码,以便toString统一返回对象的字符串表示形式。

于 2013-06-22T16:27:40.803 回答
0

String.equals()不是您想要的,因为您正在寻找以“Reda”而不是等于“Reda”的字符串结尾的字符串。使用String.matchString.endsWith一起String.toLowerCase将为您做到这一点。以下是 的示例String.match

public class Reda {
  public static void main(String[] args) {
    String[] names = {"Iman", "MohamedREDA", "Mohamed Redah", "reda"};

    for (String name : names) {
      // the input to matches is a regular expression.
      // . stands for any character, * stands for may repeating any times
      // [Rr] stands for either R or r.
      if (name.matches(".*[Rr][Ee][Dd][Aa]")) {
        System.out.println(name);
      }
    }
  }
}

及其输出:

MohamedREDA
reda

这是使用endsWithand的解决方案toLowerCase

public class Reda {
  public static void main(String[] args) {
    String[] names = {"Iman", "MohamedREDA", "Mohamed Redah", "reda"};

    for (String name : names) {
      if (name.toLowerCase().endsWith("reda")) {
        System.out.println(name);
      }
    }
  }
}

及其输出:

MohamedREDA
reda
于 2013-06-22T16:28:33.020 回答