【问题标题】:Modifying my Code to Have Methods Acting on Objects修改我的代码以使方法作用于对象
【发布时间】:2018-12-04 20:03:34
【问题描述】:

这是我目前的代码:

public class Word{

  String text;

  public Word(String text){
    this.text = text;
  }

  public static boolean isPalindrome(Word word){

    char[] text1 = new char[word.text.length()];

    for(int i = 0; i< word.text.length(); i++){
      text1[i] = word.text.charAt(i);
    }
    char[] text2 = new char[word.text.length()];
    int j = 0;
    for(int i = word.text.length()-1; i >=0; i--){
      text2[j] = word.text.charAt(i);
      j++;
    }

    for(int i = 0; i < word.text.length(); i++){
      if(text2[i]!=text1[i]){
        return false;
      }
    }
    return true;
  }

  public static void main(String[] args){

    Word word = new Word("racecar");

    System.out.println(isPalindrome(word));

  }
}   

目标

它可以工作,但我正在尝试重写我的代码以某种方式传入对象并让方法对其进行操作。所以该方法应该不接受任何输入,我应该能够编写object.isPalindrome() 并让它输出boolean

这不是为了家庭作业或任何事情。只是想进一步挑战自己,因为我对物体很虚弱。

【问题讨论】:

  • 好吧,如果其他人为你做这件事,这并不是真正挑战你自己。也许你可能想从这里开始 --> Lesson: Classes and Objects
  • 查找this关键字
  • 我相信 OP 想让isPalindrome() 方法非静态
  • (1) 删除static (2) System.out.println(word.isPalindrome());
  • @PM77-1 是的。我知道使它成为非静态允许它专门作用于一个对象,但这样做也意味着修改方法以不接受任何参数。在这种情况下,如果没有输入用于识别单词是否为回文,我将如何正确执行该方法?如果我将其设为非静态并将其保留为 System.out.println(word.isPalindrome(word)) 它确实有效,但这对我来说似乎效率低下。

标签: java oop object constructor


【解决方案1】:

很简单,不要使用word,而是使用this,它指的是调用该方法的对象。然后你需要删除static 关键字。所以像:

public boolean isPalindrome(){

    char[] text1 = new char[this.text.length()];

    for(int i = 0; i< this.text.length(); i++){
       text1[i] = this.text.charAt(i);
    }
    char[] text2 = new char[this.text.length()];
    int j = 0;
    for(int i = this.text.length()-1; i >=0; i--){
       text2[j] = this.text.charAt(i);
       j++;
    } 

    for(int i = 0; i < this.text.length(); i++){
       if(text2[i]!=text1[i]){
          return false;
       }
    }
    return true;
}

然后你可以这样称呼它:

word.isPalindrome()

【讨论】:

    【解决方案2】:

    下面的答案是因为oop-tag。

    你的回文算法

    你正在做的步骤是:

    1. string 设为char[]
    2. 创建一个与第一个相反的char[]
    3. 比较两个char[]

    重写为 OOP

    2。算法步骤

    我只是将您的代码复制并粘贴到一个新方法中并返回一个新的Word

    public Word reverse() {
        char[] reversed = new char[text.length()];
        int j = 0;
        for (int i = text.length() - 1; i >= 0; i--) {
            reversed[j]= text.charAt(i);
            j++;
        }
        return new Word(String.valueOf(reversed));
    }
    

    3。算法步骤

    由于reverse 方法返回一个新的Word,我需要比较两个Word 对象。这可以通过equals-方法来完成。我们需要从Object 覆盖它。

    算法

    public boolean isPalindrome() {
        Word reversed = reverse();
        return this.equals(reversed);
    }
    

    1.步骤在哪里

    我们只是在这里不需要它,因为我们比较两个 Words 而不是两个 char[]

    完整代码

    public class Word {
    
        private String text;
    
        public Word(String text) {
            this.text = text;
        }
    
        public boolean isPalindrome() {
            Word reversed = reverse();
            return this.equals(reversed);
        }
    
        public Word reverse() {
            char[] reversed = new char[text.length()];
            int j = 0;
            for (int i = text.length() - 1; i >= 0; i--) {
                reversed[j]= text.charAt(i);
                j++;
            }
            return new Word(String.valueOf(reversed));
        }
    
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
    
            Word word = (Word) o;
    
            return text != null ? text.equals(word.text) : word.text == null;
        }
    
        @Override
        public int hashCode() {
            return text != null ? text.hashCode() : 0;
        }
    
    }
    

    【讨论】:

      【解决方案3】:
      public class Word{
      
        String text;
      
        public Word(String text){
          this.text = text;
        }
      
        public   boolean isPalindrome(){
      
          char[] text1 = new char[this.text.length()];
      
          for(int i = 0; i< this.text.length(); i++){
            text1[i] = this.text.charAt(i);
          }
          char[] text2 = new char[this.text.length()];
          int j = 0;
          for(int i = this.text.length()-1; i >=0; i--){
            text2[j] = this.text.charAt(i);
            j++;
          }
      
          for(int i = 0; i < this.text.length(); i++){
            if(text2[i]!=text1[i]){
              return false;
            }
          }
          return true;
        }
      
      public static void main(String[] args){
          Word word = new Word("racecar");
          System.out.println(word.isPalindrome());
       }
      }
      

      与 static void main 函数相同 整个代码;)

      【讨论】:

      • 虽然此代码可能会解决问题,including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。请edit您的回答添加解释并说明适用的限制和假设。
      猜你喜欢
      • 1970-01-01
      • 2012-06-10
      • 1970-01-01
      • 1970-01-01
      • 2021-09-02
      • 1970-01-01
      • 2015-07-15
      • 1970-01-01
      相关资源
      最近更新 更多