我最近开始使用Java,并且试图获得一个简短的程序来检查单词或简短句子中的回文。
我想对反向方法使用StringBuilder。我的想法是从用户条目中获取一个变量(将其转换为小写字母,并删除空格和逗号),然后从另一个变量中保留反向条目,并使用.equals进行比较。
但是,.reverse()方法正在更改用户条目的值,我无法弄清原因。我知道Java中的引用,但只是最近才了解,还没有足够的了解。

任何帮助将非常感激。

import java.util.*;

public class Palindrome {

public static void main(String[] args) {

    Scanner kb = new Scanner(System.in);
    System.out.println("Enter a word or phrase to test for a palindrome: ");
    String entry = kb.nextLine();

    String entryLower = entry.toLowerCase();
    String entryNoSpace = entryLower.replace(" ", "");
    String entryFinal = entryNoSpace.replace(",", "");

    //Convert String to StringBuilder to use reverse method
    StringBuilder sbEntry = new StringBuilder(entryFinal);
    System.out.println("sbEntry: " + sbEntry);

    StringBuilder sbEntryReverse = sbEntry.reverse();
    System.out.println("sbEntryReverse: " + sbEntryReverse);


    System.out.println("sbEntry: " + sbEntry);


对于单词“ Dog”,将给出输出:

Enter a word or phrase to test for a palindrome:
Dog
sbEntry: dog
sbEntryReverse: god
sbEntry: god

最佳答案

您无法比较sbEntrysbEntryReverse,因为sbEntry.reverse()会更改StringBuffer所引用的sbEntry的内容。与对不可变的String对象进行操作的方法不同,像StringBuffer这样的reverse()方法会更改StringBuffer对象内部的字符缓冲区。 StringBuffer对象是可变的,而String对象不是可变的。

相反,您需要将StringBuffersbEntrysbEntryReverse)的最终内容与原始输入字符串entryFinal进行比较:

String entryLower = entry.toLowerCase();
String entryNoSpace = entryLower.replace(" ", "");
String entryFinal = entryNoSpace.replace(",", "");

//Convert String to StringBuilder to use reverse method
StringBuilder sbEntry = new StringBuilder(entryFinal);
StringBuilder sbEntryReverse = sbEntry.reverse();
boolean isPalindrome = entryFinal.equals( sbEntryReverse.toString() );

关于java - StringBuilder反向更改我的初始变量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21757250/

10-10 09:14