猿问

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

所以我正在使用扫描仪读取文件,它具有类似的格式:


title, name, age

Mr, Matthew, 20

mr,  Paul, 30

miss, 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”,尽管它是一个沉重的学习曲线。


尚方宝剑之说
浏览 265回答 3
3回答

绝地无双

虽然一般来说我不赞成使用Map用于保存对象的字段,但如果属性的数量很大,甚至可能因 CSV 文件而异(例如,某些文件有一个人就读的大学,另一个没有),那么使用 aMap来保存属性可能是合适的。在这种情况下,可以定义一个简单的Person类:public class Person {&nbsp; Map<String, String> props = new HashMap<>();&nbsp; public void addProperty(String propertyName, String value) {&nbsp; &nbsp; // could add error checking to ensure propertyName not null/emtpy&nbsp; &nbsp; props.put(propertyName, value);&nbsp; }&nbsp; /**&nbsp; &nbsp;* returns the value of the property; may return null&nbsp; */&nbsp; public String getProperty(String propertyName) {&nbsp; &nbsp; return props.get(propertyName);&nbsp; }}如果知道将始终加载某些属性/属性,则getName()可以添加诸如此类的访问器:public String getName() {&nbsp; return props.get("name");}public int getAge() {&nbsp; String age = props.get("age");&nbsp; // or throw exception if missing&nbsp; return (age != null ? Integer.parseInt(age) : -1);}尽管请注意,对于大多数数据集,我希望 name 不是单个条目,因为通常会有姓氏、名字等。 尽管如此,有限数量的常见预期值的模式是相同的。此外,您可以进行调整,以便您可以直接获取某些知名字段的整数值。然后,在解析文件时,保留具有属性定义的标题行。然后,对于随后读取的每一行,创建一个新Person对象,然后按顺序添加属性。List<Person> allPersons = new ArrayList<>();while ( (line = READ_NEXT_LINE) ) {&nbsp; // NOTE: this is not a safe way to handle CSV files; should really&nbsp; //&nbsp; &nbsp;use a CSV reader as fields could have embedded commas&nbsp; attrs[] = line.split(",");&nbsp; Person p = new Person();&nbsp; for (int i = 0; i < titleRow.length; ++i) {&nbsp; &nbsp; p.addProperty(titleRow[i], attrs[i]);&nbsp; }&nbsp; allPersons.add(p);}然后你可以得到一个特定Person的Person myPerson = allPersons.get(index_of_person),和你使用的方式非常相似Javascript,你可以做String val = myPerson.getProperty("age")。如果您需要按给定的属性进行搜索,则可以allPersons根据给定的属性对等价性进行流/循环和检查。// find all people of a given ageList<Person> peopleAge20 = allPersons.stream()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .filter(p -> p.getAge() == 20)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .collect(Collectors.toList());&nbsp; &nbsp; System.out.println(peopleAge20);&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; // summary statics (average age) for all people&nbsp; &nbsp; IntSummaryStatistics stats =&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; allPersons.stream().mapToInt(p -> p.getAge()).summaryStatistics();&nbsp; &nbsp; System.out.printf("Average age: %f\n", stats.getAverage());请注意,这种方法确实打破了 a 的想法Javabean,但这可能是也可能不是问题,具体取决于您的要求。
随时随地看视频慕课网APP

相关分类

Java
我要回答