0

我在 java 中的 2 个不同的类中各有一个字符串数组。

当我从任何数组输入一个值时,我想获取该数组值所属的类。

那么如何仅通过输入数组值来了解该类呢?

例如:

import java.io.*;
class Car {

    public static void main(String args[]) throws Exception {
        System.out.println("The parts of a car are as follows");
        for (int i = 1; i <= 5; i++) {
            System.out.println(i + str[i]);
        }
        for (int j = 1; j <= 5; j++) {
            System.out.println(j + ch[j]);
        }
        DataInputStream dis = new DataInputStream(System.in);
        System.out.println("Choose and enter any part name to group it under following                       categories:" + "\n" + "Engine" + "\t" + "\t" + "Bonet");
        String part = dis.readLine();
        if (part == ch[]) {
            System.out.println("Your choosen part is " + part + " and it comes under Engine category");
        } else {
            System.out.println("Your choosen part is " + part + " and it comes under Bonet category");
        }
    }
}

class Engine {
    String ch[] = {"asd", "fgh"};
}

class Bonet {
    String str[] = {"qwe", "rty"};
}

现在当用户输入 asd 我想显示它属于哪个类

4

2 回答 2

3

我不会给你完整的代码,因为我相信自己创建对你来说会更好。相反,您需要考虑以下几个事实:

  1. 要访问存储在其他类中的数组,您必须创建该类的实例

    Engine engine = new Engine();
    engine.ch[0];
    

    或者在您的情况下,您可能应该制作数组static

    class Engine {
        static String ch[] = { "asd", "fgh" };
    }
    

    并通过类名访问它Engine.ch[0]

  2. 数组的索引从0arraySize-1

  3. 要获取数组的大小,您可以使用它的字段length,然后像这样使用它

    for(int i=0; i<Bonet.str.length; i++){
        System.out.println(i+Bonet.str[i]);
    }
    
  4. readLine()fromDataInputStream已弃用。相反,您可以使用nextLinefromjava.util.Scanner

    Scanner scanner = new Scanner(System.in);
    //...
    String part = scanner.nextLine();
    
  5. 要检查某个对象是否存储在数组中,您必须遍历该数组的所有元素并将它们与您的对象进行比较。还要记住,要比较 String 对象,您应该使用equals类似part.equals(otherString).

    但是为了用更少的代码来实现它,你可以将你的数组包装到List并使用它的contains(Object o)方法。要将数组包装到列表中,您可以使用类中的asList方法java.util.Arrays

    if(Arrays.asList(Engine.ch).contains(part)){...
    
于 2013-06-23T16:10:01.110 回答
2

使其工作的最小更改如下。关键点:

  • Engine 和 bonet 的内容属于那些不属于 car的类的实例
  • 大小为 5 的数组具有索引 0,1,2,3,4,而不是 1,2,3,4,5
  • 在循环中遍历数组的地方不要硬编码数组大小.length而是使用

    import java.io.*;
    public class Car {
    
        public static void main(String args[]) throws Exception {
            System.out.println("The parts of a car are as follows");
    
            Engine engine=new Engine(); //we must create any components we have
            Bonet bonet=new Bonet(); //we must create any components we have
    
            for (int i = 0; i <bonet.str.length; i++) { 
                System.out.println(i +":"+ bonet.str[i]);
            }
            for (int j = 0; j < engine.ch.length; j++) {
                System.out.println(j +":"+ engine.ch[j]);
            }
            DataInputStream dis = new DataInputStream(System.in);
            System.out.println("Choose and enter any part name to group it under following                       categories:" + "\n" + "Engine" + "\t" + "\t" + "Bonet");
            String part = dis.readLine();
    
            boolean isInEngine=false; //assume isn't in engine, try to prove otherwise
    
            for(int i=0;i<engine.ch.length;i++){
                if (engine.ch[i].equals(part)){
                    isInEngine=true;
                }
            }
    
            if (isInEngine==true) {
                System.out.println("Your choosen part is " + part + " and it comes under Engine category");
            } else {
                System.out.println("Your choosen part is " + part + " and it comes under Bonet category");
            }
        }
    }
    
    class Engine {
        String ch[] = {"asd", "fgh"};
    }
    
    class Bonet {
        String str[] = {"qwe", "rty"};
    }
    

笔记; 这远非最佳解决方案,需要考虑的想法:

  • 像这样引用另一个类的内部是不好的做法,每个类(引擎和发动机罩)最好包含一个方法,该方法.testPart(String string)将返回一个布尔值,以确定它是否包含该部分
  • 代码假设如果它不在引擎中,它必须在 bonet 中,如果用户输入一些疯狂的东西怎么办
  • 数组列表(而不是数组)将允许我们使用 .contains(String string) 而不是使用循环来查看数组
  • DataInputStream不再支持(请注意,它在大多数 IDE 中都带有删除线),请考虑使用,Scanner scanner = new Scanner(System.in);然后使用scanner.nextLine();来获取该行
  • 如果您添加第三种类型的组件,最好将所有部件保存在一个数组中,那么您可以轻松添加另一个。一个接口(或抽象基类)将保证所有数组内容都包含.testPart(String string)一个getName()方法;数组/数组列表将被声明为包含接口/抽象基类
  • 你永远不会真正创建 Car 的实例,你会这样做Car car=new Car();,然后 Car 类可以具有类似car.printOptions();and的方法car.testComponent(String testString);。你这样做的方式(一个很长的 main 函数)对于小程序来说可以很好地工作,但是你的程序越大,就越难像这样工作。在这种情况下,引擎和骨骼将是汽车类的字段(从逻辑上讲,这比他们只是“闲逛”更有意义)
于 2013-06-23T16:07:16.610 回答