调用方法 - 对此有所了解

时间:2013-09-16 01:52:56

标签: java

我正在编写一个程序来整理两个文本字符串。例如,“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的新手,几乎不知道任何事情,所以一些指示和帮助将不胜感激!

5 个答案:

答案 0 :(得分:2)

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

较长的答案结束相同,但首先指出你的程序目前不会实际运行......

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

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

最简单的解决方案是为constructor类提供Collate,可以从main调用...

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);
    }
}

因为缺乏背景,所以找不到具体的解决方案......

答案 1 :(得分:2)

不要偏离其他答案,这是我的看法。

以下是我改变的内容:

  • 删除了类变量。它们在collate电话之外并没有多大意义。
  • 已移除in2。你应该只有1 Scanner
  • 已移除accumulator。没用过。
  • main更改为static,否则Java不会将其视为切入点。
  • collate更改为static,因为它不再依赖于任何类实例变量,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();
}

答案 2 :(得分:1)

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

您可以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));

答案 3 :(得分:0)

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

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

使用本地变量而不是ab(因此您不会混淆名称),并将它们保留在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
}

现在,要在课堂上调用该方法,您需要to instantiate a new instance of Collate

Collate col = new Collate();

要调用该方法,请使用该实例,并使用表示要置换的参数的collate()调用System.out.println(col.<insert_method_here>(_which_was_a?, _which_was_b?)); 。我会把填空的空白作为练习留给读者。

accumulator

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

答案 4 :(得分:-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);
    }
}