【问题标题】:Storing elements that have multiple elements存储具有多个元素的元素
【发布时间】:2012-10-29 22:02:16
【问题描述】:

存储具有多个元素的元素的最佳方式是什么?就像在 6d 数组中一样。 我已经看到了一些类似 ArrayList(ArrayList(ArrayList(ArrayList))) 的内容,但不知道如何或大部分原因将其配置为这样或如何访问元素!

例如,我想创建一个存储以下信息的数组(列表):

房屋 ID、门牌号、街道名称、居民、业主名字、业主姓氏

我希望能够对主记录元素中的任何子元素进行排序和搜索。

我所做的是创建一个数组列表,其中包含每个数组列表。基本上我有一个名为 HouseArray 的类,它有一个名为 CreateArray 的方法。从我的类 GUI 中,我有

houses = new HouseArray();
houses.CreateArray();

在课堂上 HouseArray,我的 CreateArray 方法有

ArrayList<Integer> entryID;
ArrayList<Integer> houseNum;
ArrayList<String> streetName;
ArrayList<Integer> residents;
ArrayList<String> firstName;
ArrayList<String> lastName; 

entryID = new ArrayList();
houseNum = new ArrayList();
streetName = new ArrayList();
residents = new ArrayList();
firstName = new ArrayList();
lastName = new ArrayList(); 

然后我使用 AddEntry 方法将数据放入每个数组列表中。

this.entryID.add(12345);
this.houseNum.add(9876);
this.streetName.add("My Street");
this.residents.add(4);
this.firstName.add("John");
this.lastName.add("Jones");

我不知道如何对这些混乱进行排序并保持条目同步,而无需手动编写大量代码来完成所有工作。此外,我希望能够汇总居住在特定街道名称上的居民人数,或居住在拥有名字或姓氏的房屋中的居民人数。

我是在正确的轨道上还是有更好的方法来做到这一点? 自学java,所以不确定这是否算作家庭作业。

【问题讨论】:

    标签: java sorting arraylist


    【解决方案1】:

    例如,我想创建一个数组(列表)来存储 以下信息:

    房屋 ID、门牌号、街道名称、房屋颜色、业主名字、 所有者姓氏

    最好的方法是创建一个Class,将其命名为House,并将这些属性作为它的state

    class House {
    
    private long houseId;
    private long hNo;
    private String streetname;
    private String color;
    private String owner;
    private String firstName;
    public House(long houseId, long hNo, String streetName, String color, String owner, String firstName){
      //initialize your instance variables here
    

    }

     public void setHouseId(long houseId){
      this.houseId = houseId;
      }
     //do the same thing for reamining attributes
     //getters and setters for all the attributes.
    }
    

    现在,创建一个包含 House 对象的 java.util.List。

    List<house> houseList = new Arraylist<>();
    //and populate the list with house objects.
    House house1 = new House(123,223,"Bond Street", "Green","James Bond", "James");
    list.add(house1);
    

    这种方法更像是Object-Oriented 的做事方式,因为House 代表一个具有statebehaviour 的对象。但是,如果您想对arrayList 中的House 元素进行排序,则必须覆盖equals 和 hashcode 方法。

    【讨论】:

    • @Rohit Jain Ding,灯泡时刻!谢谢!这真的让我朝着正确的方向前进。
    • 感谢您的欢迎。我可以得到更多关于设置和获取的代码示例吗?我认为我的代码是正确的,我只需要删除额外的数组。如何将多个信息字段设置到每个房屋对象中?我无法全神贯注地访问每个对象的各个元素。
    【解决方案2】:

    我不知道该如何整理这个烂摊子

    首先,其他人已经指出你应该创建一个House 类来组织“这个烂摊子”。

    要对其进行排序,请实现Comparator 接口,例如(假设你的 House 类有一个 getEntryID 方法):

    public class HouseIDComparator implements Comparator<House> {
    
        @Override
        int compare(House house1, House house2) {
            return house1.getEntryID().compareTo(house2.getEntryID());
        }
    
    }
    

    这个比较器可以传递给Collections.sort(List&lt;T&gt;, Comparator&lt;? super T&gt;)进行排序。 (请注意,还有一个带有一个参数的排序方法,用于实现Comparable 接口的类型列表。但是,您可能不希望您的House 类实现它,因为它在什么基础上并不明显应该比较,你自己可能想使用几个不同的。)

    至于对值求和,最好的方法是遍历列表中的所有元素并手动求和。

    【讨论】:

    • 太好了,谢谢。我想我可以通过一些实验来实现这一点。
    • 就排序而言,我想按街道名称、业主姓名(名字或姓氏)和/或居民人数进行排序......
    【解决方案3】:

    我认为您不只是 Java 新手。一般来说,您是新的面向对象编程。你是学生,这是某种家庭作业吗?如果是,请标记它。

    对于您的特定数据,您的类应该是 House。

    public class House
    {
        int entryId;
        int houseNum;
        String streetName;
        String houseColor;
        String firstName;
        String lastName;
    }
    

    请注意,在我上面的示例代码中,我假设您对 java 有足够的了解,可以添加 privatepublic 等访问修饰符,并且对如何添加 getter 和 setter 方法有足够的了解(例如getEntryId()setEntryId(int entryId) 等)。

    如果您的对象实际上更复杂,您最好创建 AddressPerson 等类。

    然后使用这个类,你确实创建了一个列表:

        List<House> houses = new ArrayList<House>();
        House myHouse = new House();
        // insert whatever data you want into "myHouse"
        houses.add( myHouse );
    

    要对列表中的对象进行排序,因为它在 List 中,它是 Java 集合框架的一部分。您可以使用Collections.sort() 方法对其进行排序。但首先您需要了解它是如何工作的。

    我会建议你以下页面:

    【讨论】:

    • 我做了一个编辑,但看起来不像它。我正在自学并提出这个项目作为练习,以更好地理解具有多个元素的数组。这算作功课吗?感谢您的信息,每个花絮都加起来!
    【解决方案4】:

    你在哪里看到along the lines of ArrayList(ArrayList(ArrayList(ArrayList)))??这看起来很奇怪。从来没有这样的设计..

    如果您想存储多个字段,则创建一个包含所有这些字段的自定义类,并拥有该类的 ArrayList。

    例如:-

    class House{
        private int houseId;
        private int houseNumber;
        private String streetName;
        private String owner;
        private String firstName;
    
        // Constructors
    
        // Getters and Setters
    }
    

    并创建该类的ArrayList:-

    List<House> myHouses = new ArrayList<House>();
    

    然后,要将对象添加到您的列表中,只需使用普通的add 方法:-

    myHouses.add(new House(houseId, houseNumber, ....));
    

    并访问元素:-

    for (House myHouse: myHouses) {
        System.out.println(myHouse.getHouseNumber());
    }
    

    【讨论】:

    • 经过几天的搜索,我能找到的唯一示例是单元素数组列表或奇怪的墙外代码,这对我来说毫无意义。我试图追查这个例子,但失去了它。它可能涉及内部和外部数组。
    【解决方案5】:

    我认为另一种方法是使用这些属性创建 House 类。

    实例化房屋对象并添加到arraylist。您可以重写 equals 和 hashcode 方法来执行排序。

    例子:

    class House{
    int houseNum;
    String street;
    
    ...
    
    //get/set for above properties.
    }
    

    并将其添加到列表中:

    House houseObj = new House();
    list.add(houseObj);
    

    【讨论】:

    • 谢谢!这真的帮助了我,让我朝着正确的方向前进。我没有客观地看待它(笑)!
    猜你喜欢
    • 2019-03-29
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    相关资源
    最近更新 更多