Java 如何声明对象引用变量并根据用户输入为其赋值。?

Java 如何声明对象引用变量并根据用户输入为其赋值。?,java,Java,我正在创建一个命令行电影注册器,用户可以在其中使用不同的方法 过滤电影、导演和演员 我想知道是否可以声明一些对象引用变量,并根据用户输入为它们赋值。也就是说,如果用户输入是小写,我想声明并为Person[]对象和ArrayList(Persons)对象等赋值,如果用户输入是大写,我想声明并为Film[]对象和ArrayList(Film)对象等赋值 代码: //字符串kode是用户输入 无效查找(字符串kode){ if(Character.isLowerCase(kode.charAt(0))

我正在创建一个命令行电影注册器,用户可以在其中使用不同的方法 过滤电影、导演和演员

我想知道是否可以声明一些对象引用变量,并根据用户输入为它们赋值。也就是说,如果用户输入是小写,我想声明并为Person[]对象和ArrayList(Persons)对象等赋值,如果用户输入是大写,我想声明并为Film[]对象和ArrayList(Film)对象等赋值

代码:

//字符串kode是用户输入
无效查找(字符串kode){
if(Character.isLowerCase(kode.charAt(0)){//如果输入是电影代码
ArrayList utvalg=新的ArrayList();
迭代器it=personer.keySet().Iterator();
人员对象=新人员();
HashMap map=Filmregister.personer;
人[]arr;
}else{//如果输入是个人代码
ArrayList utvalg=新的ArrayList();
迭代器it=filmer.keySet().Iterator();
胶片obj=新胶片();
HashMap map=Filmregister.filmer;
电影【】arr;
}
while(it.hasNext()){
字符串nokkel=(String)it.next();
String subnokkel=nokkel.substring(0,kode.trim().length());
if(次整数等于(kode)){
obj=map.get(nokkel);
utvalg.add(obj);
}否则{
//无所事事
} 
}
arr=Utils.SORTRFILMERBC(utvalg);
}
因此,当我在if-else块之外引用变量时,javac在所有变量上都给了我“找不到符号”。我意识到这是因为变量是在if-else范围内声明的,但我希望有一种方法可以做到这一点,这样我就不必每次都使用if-else语句来引用Person对象或Film对象

我研究了在if语句中声明列表和与Person相关的映射,然后将实例强制转换为Film对象的可能性(如果用户想要一个films列表),但是发现这种类型的强制转换要求类具有继承关系,这不适合于这些类


这是我的第一篇文章,如果太琐碎,请告诉我。

把变量声明移到if语句块之外好吗?这将包括
ArrayList utvalg
(这是您似乎正在使用的唯一一个)以及以后需要的任何其他变量。

最终,如果您希望一个声明的变量(在本例中为
arr
)引用两种不同类型的集合,那么这些类型必须共享一个超类或接口。当然,所有东西都以超类的形式共享对象,所以您可以将其键入
对象[]
,但这很弱

通常我看到的做法是使用接口标记可能由共享代码处理的相关类。所以说
Person
Film
都实现了一个接口
FindableByString
。然后,find方法可以根据它获得的输入类型执行一些简单的逻辑,并调用一个泛型方法来完成大部分工作:

<T extends FindableByString> ArrayList<T> findInMap( String kode, Map<String,T> map) {

  Iterator <String> it = map.keySet().iterator();
  ArrayList<T> utvalg = new ArrayList<T>();

  while (it.hasNext()) {

    String nokkel = it.next();
    String subnokkel = nokkel.substring(0, kode.trim().length());

    if (subnokkel.equals(kode)) {

      T obj = map.get(nokkel);
      utvalg.add(obj);

    } else {
    // do nothing
    }
  }

  return utvalg; 
}

void find(String kode) {

  HashMap<String,? extends FindableByString> map;
  ArrayList<? extends FindableByString> list;
  FindableByString[] arr;

  if (Character.isLowerCase(kode.charAt(0))) {

    map = personer;
    arr = new Person[1];

  } else {

    map = filmer;
    arr = new Film[1];

  }

 list = findInMap( kode, map );
 arr = list.toArray( arr );

}
ArrayList findInMap(字符串kode,地图地图){
迭代器it=map.keySet().Iterator();
ArrayList utvalg=新的ArrayList();
while(it.hasNext()){
字符串nokkel=it.next();
String subnokkel=nokkel.substring(0,kode.trim().length());
if(次整数等于(kode)){
T obj=map.get(nokkel);
utvalg.add(obj);
}否则{
//无所事事
}
}
返回utvalg;
}
无效查找(字符串kode){
HashMap图;

ArrayList这行不通。他想要一个
列表
列表
,这取决于用户的选择。然后可能只是一个
ArrayList
,而不指定对象类型?这将结束编译。但这真的是你想要做的吗?当然,这是一种完全不同的方法,需要相关人员采取适当的行动密码
<T extends FindableByString> ArrayList<T> findInMap( String kode, Map<String,T> map) {

  Iterator <String> it = map.keySet().iterator();
  ArrayList<T> utvalg = new ArrayList<T>();

  while (it.hasNext()) {

    String nokkel = it.next();
    String subnokkel = nokkel.substring(0, kode.trim().length());

    if (subnokkel.equals(kode)) {

      T obj = map.get(nokkel);
      utvalg.add(obj);

    } else {
    // do nothing
    }
  }

  return utvalg; 
}

void find(String kode) {

  HashMap<String,? extends FindableByString> map;
  ArrayList<? extends FindableByString> list;
  FindableByString[] arr;

  if (Character.isLowerCase(kode.charAt(0))) {

    map = personer;
    arr = new Person[1];

  } else {

    map = filmer;
    arr = new Film[1];

  }

 list = findInMap( kode, map );
 arr = list.toArray( arr );

}