4

我正在编写一个程序来整理两个文本字符串。例如,“google”和“chrome”变为“gcohorgmlee”(您可以假设字母的长度相同)。

public class Collate {

    String result;
    String a;
    String b;

    public void main(String[] args) {
        System.out.printf("Enter 1st word: ");
        Scanner in1 = new Scanner(System.in);
        a = in1.next();
        System.out.printf("Enter second word: ");
        Scanner in2 = new Scanner(System.in);
        b = in2.next();

    }

    public String collate(String a, String b) {
        String accumulator;
        this.a = a;
        this.b = b;


        for (int i = 0; i < a.length(); i++) {
            result += a.charAt(i);
            result += b.charAt(i);
        }
        return (result);
    }
}

然而,我被困在如何打电话上collate()。我对 Java 很陌生,几乎什么都不懂,所以非常感谢一些指针和帮助!

4

5 回答 5

2

最简单的答案是简单地说,使用collate(a, b)并将值分配回变量或将其打印到屏幕上......

较长的答案以同样的方式结束,但首先指出您的程序目前实际上不会运行......

public void main(String[] args){不是您的程序的有效入口点。相反,它应该是public static void main(String[] args){

现在,如果你这样做,你最终会得到一些编译器错误,说明你的应用程序的某些非静态部分不能从静态上下文中访问......

最简单的解决方案是提供一个可以从...调用constructor的类Collatemain

public class Collate{
    String result;
    String a;
    String b;

    public void main(String[] args){
        new Collate();
    }

    public Collate() {
        System.out.printf("Enter 1st word: "); 
        Scanner in1 = new Scanner(System.in);
        a = in1.next();
        System.out.printf("Enter second word: ");
        Scanner in2 = new Scanner(System.in);
        b = in2.next();
        String collation = collate(a, b);
        System.out.println(collation);
    }

    public String collate(String a, String b){
        String accumulator;
        this.a = a;
        this.b = b;


        for(int i = 0; i < a.length(); i++)
        {
            result += a.charAt(i);
            result += b.charAt(i);
        }
        return (result);
    }
}

更新

我似乎对责任产生了很好的影响。虽然它可以争辩说类的责任是询问用户他们想做什么和做什么,但也可以说类应该是自包含的它的任务,例如......

public class Collate{
    String result;
    String a;
    String b;

    public void main(String[] args){
        System.out.printf("Enter 1st word: "); 
        Scanner in1 = new Scanner(System.in);
        a = in1.next();
        System.out.printf("Enter second word: ");
        Scanner in2 = new Scanner(System.in);
        b = in2.next();
        Collate collate = new Collate();
        String collation = collate.collate(a, b);
        System.out.println(collation);
        new Collate();
    }

    public String collate(String a, String b){
        String accumulator;
        this.a = a;
        this.b = b;


        for(int i = 0; i < a.length(); i++)
        {
            result += a.charAt(i);
            result += b.charAt(i);
        }
        return (result);
    }
}

因为严重缺乏上下文,所以不可能找到具体的解决方案......

于 2013-09-16T02:00:26.233 回答
2

不要从其他答案中拿走任何东西,这是我的看法。

这是我更改的内容:

  • 删除了类变量。在电话之外,它们并没有太大的意义collate
  • 已删除in2。你应该只有 1 Scanner
  • 已删除accumulator。它没有被使用。
  • 改为mainstatic否则它不会被 Java 视为入口点。
  • 更改collatestatic,因为它不再依赖于任何类实例变量,并且static允许main直接调用它。
  • 初始化result为空字符串。

代码:

public class Collate {
    public static void main(String[] args) {
        Scanner in1 = new Scanner(System.in);
        System.out.printf("Enter 1st word: ");
        String a = in1.next();
        System.out.printf("Enter second word: ");
        String b = in1.next();
        System.out.println(collate(a,b));
    }

    public static String collate(String a, String b) {
        String result = "";
        for (int i = 0; i < a.length(); i++) {
            result += a.charAt(i);
            result += b.charAt(i);
        }
        return result;
    }
}

一个更有效的选择是使用StringBuilder:(
尽管这对于在生产环境之外编写的代码,甚至大多数生产代码来说都不太可能是必需的)

public static String collate(String a, String b) {
    StringBuilder result = new StringBuilder();
    for (int i = 0; i < a.length(); i++) {
        result.append(a.charAt(i));
        result.append(b.charAt(i));
    }
    return result.toString();
}
于 2013-09-16T02:30:03.110 回答
1

现在,collate正在使用String属于Collate类的特定实例的变量,但它确实不需要;它完成工作所需的所有信息都作为参数传入。由于实例变量(字段)Collate.aCollate.b没有做任何有用的事情,您可以消除它们,并且该result变量也仅在collate方法内有用,因此您应该在那里声明它(这就是它accumulator的用途,所以使用它变量;您需要将其设置为空字符串""才能开始)。(实际上,如果您collate多次调用,您当前的版本会失败,因为它只会在上一个结果的末尾添加字符。)

您可以 make collate static,这意味着它不需要属于任何特定的信息Collate,并直接从以下位置调用它main

public static String collate(String a, String b) {
    String accumulator = "";

    for (int i = 0; i < a.length(); i++) {
        accumulator += a.charAt(i);
        accumulator += b.charAt(i);
    }
    return accumulator;
}

// in main
System.out.println(collate(a,b));
于 2013-09-16T02:00:20.407 回答
0

所以......这段代码有几个问题。

您的成员变量ab没有声明static;因此,它们不能被引用main(也应该是static)。

使用局部变量而不是aor b(这样您就不会混淆名称),并将它们持久保存在main. 您也可以彻底摆脱成员变量。

public static void main(String... args) {
    String firstWord;  // takes the place of a
    String secondWord; // takes the place of b
    // code omitted for brevity
}

现在,要在您的类上调用该方法,您需要实例化Collate.

Collate col = new Collate();

要调用该方法,请使用实例,并collate()使用代表您想要置换的参数进行调用。我将把填空作为练习留给读者。

System.out.println(col.<insert_method_here>(_which_was_a?, _which_was_b?));

最后,变量accumulator存在于 的范围内collate,但result不存在。选择accumulator附加到。摆脱对成员变量的分配。

于 2013-09-16T02:22:28.250 回答
-1

总而言之,这里就是你需要的

package mypackage;

import java.util.Scanner;

public class Collate {

    public static void main(String[] args) {
        Scanner in1 = null;
        Scanner in2 = null;
        try {
            System.out.printf("Enter 1st word: ");
            in1 = new Scanner(System.in);

            String a = in1.next();

            System.out.printf("Enter second word: ");
            in2 = new Scanner(System.in);
            String b = in2.next();

            System.out.println(new Collate().collate(a, b));
        } finally {
            in1.close();
            in2.close();
        }

    }

    public String collate(String a, String b) {
        String result = "";
        for (int i = 0; i < Math.max(a.length(), b.length()); i++) {
            result += a.charAt(i);
            result += b.charAt(i);
        }
        return (result);
    }
}
于 2013-09-16T02:00:09.737 回答