【问题标题】:Java calling details from array list from another class从另一个类的数组列表中调用 Java 的详细信息
【发布时间】:2016-04-05 23:33:43
【问题描述】:

我有 2 个示例类来尝试更好地理解数组列表。 PersonData 包含一个数组列表。 PersonType 将从数组列表中获取详细信息。我试图理解数组列表背后的逻辑。例如,如果要求用户输入 personID,我怎么能带回那个人的字母和年龄。如何通过输入列表中的值从数组列表中检索 1 个人的内容?

public class PersonData {

    private final List<personList> personList;

    public PersonData() {  //constructor
        personList= new ArrayList<>();
        personList.add(new personList(1, 'x', 23));
        personList.add(new personList(2, 'y', 28));
        personList.add(new personList(3, 'z', 37));

    }

import java.io.Serializable;

public class PersonType implements Serializable {

    int personID;
    String personLetter;
    int personAge;

    // constructor 
    public PersonType (int pID, String pLetter, int pAge) {
        personID= pID;
        personLetter = pLetter;
        personAge= pAge;
    }

    public PersonType () {
        this(0,"",0);
    }

    public int getPersonID() {
        return (personID);
    }

    public String getPersonLetter() {
        return (personLetter );
    }

    public int getPersonAge() {
        return (personAge);
    }
} 

【问题讨论】:

  • 你不是说new PersonType吗?请仅发布可编译的代码(MCVE)。

标签: java arrays serialization arraylist


【解决方案1】:

最简单的方法是使用 Map 而不是 List。

public class PersonData {

  private final Map<Integer,PersonType> map;

  public PersonData() {  //constructor
    map = new HashMap<>();
    map.put( 1, new PersonType(1, 'x', 23));
    map.put( 2, new PersonType(2, 'y', 28));
    map.put( 3, new PersonType(3, 'z', 37));
 }

现在您可以在恒定时间内通过 ID 获取特定的人。

 PersonType person = map.get( 2 );

如果您真的想将数据存储在列表中,则查找特定匹配项可能需要对列表进行线性搜索。 (如果您知道它已排序,则可以进行二进制搜索,成本为 O(log n)。)

这是通过列表线性搜索第一个匹配元素的草图。 (我面前没有编译器。)鉴于:

private final List<personList> personList;

然后在列表中找到一个具有匹配 ID 的人:

int searchID = 2;

Optional<PersonType> p = personList.stream()
  .filter( p -> p.getPersonID() == searchID )
  .findFirst();

【讨论】:

  • 所以数组列表无法做到这一点?
  • 是的,您可以使用列表来做到这一点,但访问正确的元素将是更多的工作,对您和虚拟机都是如此。我将尝试用流勾勒出一种方法。我现在不在办公桌前,所以请记住它尚未经过测试。
  • List&lt;V&gt; 在概念上与Map&lt;Integer, V&gt; 非常相似。正如您所描述的那样,您经常可以使用List。但这通常不是一个好主意 - Map 实现通常对于查找式操作更有效。例外情况是,如果您的键总是连续的正整数(最好从零开始)。在这种有限的情况下,List 可能更可取。
  • @userlml - 好的,我草拟了一种用于列表的方法。请记住,对于列表,按 ID 访问元素的成本随着列表中元素的数量线性增长。使用 HashMap,它保持不变。
  • 此外,如果人员 ID 在较短的范围内,您可以直接使用 ArrayList 并根据可以充当 ID 的索引(List.get() 方法)存储/访问对象
猜你喜欢
  • 2022-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-25
  • 2015-09-10
  • 1970-01-01
  • 2021-09-26
相关资源
最近更新 更多