Java 替换两个字符串而不重写另一个值

Java 替换两个字符串而不重写另一个值,java,eclipse,Java,Eclipse,我今天午夜有一个作业要交。除了一个问题外,我几乎完成了所有的作业。我需要将“r”和“q”作为值相互交换。因此,如果在编译器中输入“r”,那么如果输入“q”,那么应该得到“q”(使用JOptionPane)。例如,如果您的名字是Quart,编译器应该打印Ruaqt。我尝试使用replace.All方法,但有一次我只能交换“r”或“q”,不能同时交换两个。我知道我需要一个临时变量,但不知道其他任何事情 我们必须用后面的字母替换元音,所以我这样做: String firstName = JOption

我今天午夜有一个作业要交。除了一个问题外,我几乎完成了所有的作业。我需要将“r”和“q”作为值相互交换。因此,如果在编译器中输入“r”,那么如果输入“q”,那么应该得到“q”(使用
JOptionPane
)。例如,如果您的名字是Quart,编译器应该打印Ruaqt。我尝试使用replace.All方法,但有一次我只能交换“r”或“q”,不能同时交换两个。我知道我需要一个临时变量,但不知道其他任何事情

我们必须用后面的字母替换元音,所以我这样做:

String firstName = JOptionPane
    .showInputDialog("What is your first name?");

String lastName = JOptionPane
    .showInputDialog("What is your last name?");

String fullname = firstname + lastname; 
String lowername = fullName.toLowerCase();
String encryptedname = lowername.replaceAll("a", "b")
        .replaceAll("e", "f").replaceAll("i", "j").replaceAll("o", "p")
        .replaceAll("u", "v");
谢谢

publicstaticvoidmain(String[]args){
字符串origin=“r和q”;
System.out.println(newReplacement(原点'r','q'));
}
私有静态字符串newReplacement(字符串来源,char firstChar,char secondChar){
StringBuffer StringBuffer=新的StringBuffer(原点);
对于(int i=0;i
用简单的方法重写replace方法。

您可以试试这个

private static final char Q_STR = 'q';
private static final char R_STR = 'r';


public static String replaceString(String original, int position, char strToReplace) {
    StringBuilder strBuilder = new StringBuilder(original);
    if (strToReplace == Q_STR) {
        strBuilder.setCharAt(position, R_STR);
    } else if (strToReplace == R_STR){
        strBuilder.setCharAt(position, Q_STR);
    }
    return strBuilder.toString();
}

public static void main(String[] args) {

    String firstname = "Quart";
    String lastname = " QuartLastName";

    String fullname = firstname + lastname; 
    String lowername = fullname.toLowerCase();

    //get all chars in String
    char[] array = lowername.toCharArray();

    //list to keep original position of Q char
    List<Integer> allQPosition = new ArrayList<Integer>();
    //list to keep original position of R char
    List<Integer> allRPosition = new ArrayList<Integer>();

    for (int i = 0; i < array.length; i++) {
        if(array[i] == 'q') {
            allQPosition.add(i);
        } else if(array[i] == 'r') {
            allRPosition.add(i);
        }
    }

    //replace q
    for (Integer integer : allQPosition) {
        lowername = replaceString(lowername, integer, Q_STR);
    }

    //replace r
    for (Integer integer : allRPosition) {
        lowername = replaceString(lowername, integer, R_STR);
    }

    //replace others
    String encryptedname = lowername.replace("a", "b")
                                    .replace("e", "f")
                                    .replace("i", "j")
                                    .replace("o", "p")
                                    .replace("u", "v");

    System.out.println("Result: " + encryptedname);
}
private static final char Q_STR='Q';
私有静态最终字符R_STR='R';
公共静态字符串replaceString(字符串原始、int位置、字符strToReplace){
StringBuilder strBuilder=新StringBuilder(原件);
if(strToReplace==Q_STR){
strBuilder.setCharAt(位置,R_STR);
}else if(strToReplace==R_STR){
strBuilder.setCharAt(位置,Q_STR);
}
返回strBuilder.toString();
}
公共静态void main(字符串[]args){
String firstname=“Quart”;
String lastname=“QuartLastName”;
字符串fullname=firstname+lastname;
String lowername=fullname.toLowerCase();
//把所有的字符串起来
char[]数组=lowername.toCharArray();
//保留Q字符原始位置的列表
List allQPosition=new ArrayList();
//列表以保持R字符的原始位置
List allRPosition=new ArrayList();
for(int i=0;i
我的解决办法是:

  • 保持“q”和“r”的所有位置远离原始字符串
  • 更换每一个
  • 替换其他字符

希望这有帮助,不知道为什么使用
StringBuilder
的两个答案都会使事情变得比需要的更复杂

以下是使用
StringBuilder
进行单字符交换的方法:

public static String swapChar(String string, char c1, char c2) {
    StringBuilder sb = new StringBuilder(string);
    for (int i = 0; i < sb.length(); ++i) {
        if (sb.charAt(i) == c1) {
           sb.setCharAt(i, c2);
        } else if (sb.charAt(i) == c2) {
           sb.setCharAt(i, c1);
        }
    }
    return sb.toString();
}
甚至更简单,通过使用Apache Commons Lang:

String result = StringUtils.replaceChars(inputString, "rqaeiou", "qrbfjpv");

如果不显示任何尝试或任何代码,您在家庭作业上就不会得到任何帮助。您需要循环浏览字符,一次一个。能否将此添加到问题中以使其更可见?不要在注释中发布代码。编辑问题。记住Java字符串和字符区分大小写。此外,您的代码没有包含您在问题中提到的
replaceAll
的所有组合(例如
Q
->
R
)-1因为:1。您创建了一个提供2个字符的方法,但在您的方法中,您是在硬编码以与
'q'
进行比较。2.如果使用
编写它会更好,但是使用
继续
编写会使代码更难跟踪1,确定,忘记,编辑,2。我知道continue语句不好,但如果使用elseif,最后必须编写else语句(用于编码约定),如if->elseif->else2。从未听说过“让别人疯狂是一个好习惯”。即使您愿意,如果有一个
else
的主体是空的,并且注释说该字符被跳过,那么继续
仍然更好。就像你正在做的一样,拥有
其他的
无疑是件好事,但这是强制性的吗?实际上,我看到编码惯例明确地说,除非确实需要,否则永远不要使用
continue
。您的代码实际上是一个很好的例子,说明为什么使用
continue
会使代码难以维护。通过浏览
if
s,很容易给人留下这样的印象,即每个
if
案例都将被评估(但结果并非如此)。这就是为什么
else如果为so创建了
,那么将else语句留空,它什么也不做?不,这不是我喜欢的方式。顺便说一句,@Adrian,在这种情况下,我想字符串输入不会太多,也不会有并发任务,因此我看不出使用StringBuffer和StringBuilder有什么不同,(sr,不能在上面添加注释)1)有什么理由这样复杂的“保存位置并替换为保存位置”吗不是直接替换它们,而是直接替换它们?2) 您使用的
StringBuilder
实际上是“如何误用
StringBuilder
”的一个很好的例子。为每个字符替换创建一个
StringBuilder
。资源的完全浪费
StringBuilder
(或
StringBuffer
)旨在创建一次,让您对其内容进行杂项更改,然后让您进行转换
public static String replaceChars(String string, Map<Character,Character> cmap) {
    StringBuilder sb = new StringBuilder(string);
    for (int i = 0; i < sb.length(); ++i) {
        if (cmap.containsKey(sb.charAt(i)) {
            sb.setCharAt(i, cmap.get(sb.charAt(i));
        }
    }
    return sb.toString();
}
// or make a util method to make these even easier to create
Map<Character,Character> cmap = new HashMap<Character,Character>();
cmap.put('r','q');
cmap.put('q','r');
cmap.put('a','b');
cmap.put('e','f');
cmap.put('i','j');
cmap.put('o','p');
cmap.put('u','v');
String result = replaceChars(inputString, cmap);
String result = StringUtils.replaceChars(inputString, "rqaeiou", "qrbfjpv");