为了账号安全,请及时绑定邮箱和手机立即绑定

如何从java中的字符串指定类属性

如何从java中的字符串指定类属性

尚方宝剑之说 2021-10-27 10:57:00
所以我正在使用扫描仪读取文件,它具有类似的格式:title, name, ageMr, Matthew, 20mr,  Paul, 30miss, Anne, 24 CSV^class person{String name, title;int age; public  crimeData(String csv){    String[]list = csv.split(",", -1);    name = list[0];    title = list[1];    age = list[2];}}控制台程序    Scanner input = new Scanner(System.in);    System.out.println("Please select what data you want to load:");    String selection = input.next();    int temp = 0;    for(int i=0; i< header.length; i++){        if(header[i].equals(selection)){            temp = i;        break;      }    }temp 会给我们指定选项的索引,所以如果它是 2 我们将要访问 age 属性当我的控制台应用程序运行时,我会提示他们(用户)输入他们想要的数据。所以他们可能会输入“年龄”所以我不知道如何使用这个“年龄”字符串并用它访问 person 对象。程序输出的理想情况应该是:20,30,24遍历每个时代并打印我接受他们的输入,String input = scanner.nextLine(); 然后我循环遍历我的 person 对象数组以获取输入的索引。一旦我有了这个索引,我就想在索引处访问 person 的属性。因此,如果我的索引为 1,我想访问属性“名称”。在 javascript 中,我可以用字符串说person['age']虽然 java 是一个完全不同的故事。我已经研究了 java 的“反射 API”,尽管它是一个沉重的学习曲线。
查看完整描述

3 回答

?
绝地无双

TA贡献1946条经验 获得超4个赞

虽然一般来说我不赞成使用Map用于保存对象的字段,但如果属性的数量很大,甚至可能因 CSV 文件而异(例如,某些文件有一个人就读的大学,另一个没有),那么使用 aMap来保存属性可能是合适的。


在这种情况下,可以定义一个简单的Person类:


public class Person {

  Map<String, String> props = new HashMap<>();


  public void addProperty(String propertyName, String value) {

    // could add error checking to ensure propertyName not null/emtpy

    props.put(propertyName, value);

  }


  /**

   * returns the value of the property; may return null

  */

  public String getProperty(String propertyName) {

    return props.get(propertyName);

  }

}

如果知道将始终加载某些属性/属性,则getName()可以添加诸如此类的访问器:


public String getName() {

  return props.get("name");

}


public int getAge() {

  String age = props.get("age");

  // or throw exception if missing

  return (age != null ? Integer.parseInt(age) : -1);

}

尽管请注意,对于大多数数据集,我希望 name 不是单个条目,因为通常会有姓氏、名字等。 尽管如此,有限数量的常见预期值的模式是相同的。此外,您可以进行调整,以便您可以直接获取某些知名字段的整数值。


然后,在解析文件时,保留具有属性定义的标题行。然后,对于随后读取的每一行,创建一个新Person对象,然后按顺序添加属性。


List<Person> allPersons = new ArrayList<>();


while ( (line = READ_NEXT_LINE) ) {

  // NOTE: this is not a safe way to handle CSV files; should really

  //   use a CSV reader as fields could have embedded commas

  attrs[] = line.split(",");

  Person p = new Person();

  for (int i = 0; i < titleRow.length; ++i) {

    p.addProperty(titleRow[i], attrs[i]);

  }


  allPersons.add(p);

}

然后你可以得到一个特定Person的Person myPerson = allPersons.get(index_of_person),和你使用的方式非常相似Javascript,你可以做String val = myPerson.getProperty("age")。


如果您需要按给定的属性进行搜索,则可以allPersons根据给定的属性对等价性进行流/循环和检查。


// find all people of a given age

List<Person> peopleAge20 = allPersons.stream()

            .filter(p -> p.getAge() == 20)

            .collect(Collectors.toList());

    System.out.println(peopleAge20);        


    // summary statics (average age) for all people

    IntSummaryStatistics stats = 

            allPersons.stream().mapToInt(p -> p.getAge()).summaryStatistics();

    System.out.printf("Average age: %f\n", stats.getAverage());

请注意,这种方法确实打破了 a 的想法Javabean,但这可能是也可能不是问题,具体取决于您的要求。


查看完整回答
反对 回复 2021-10-27
  • 3 回答
  • 0 关注
  • 264 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信