Java 将数组分配给对象时的混淆

Java 将数组分配给对象时的混淆,java,arrays,object,Java,Arrays,Object,我有一个包含各种信息的文本文件,但它可以归结为名称/描述/网站,然后按顺序重复,直到文件完成。我假设在将三个数据组合成一个对象后,获取该文件并对数据进行排序。我对这到底意味着什么以及如何做到感到困惑。 这是我教授的一句话,解释了该怎么做,但我不知道该怎么做。 “您可以设计和实现一个用户定义对象,该对象由三个属性值组成,必须作为一个单元组合。创建用户定义对象后,您可以实例化该用户定义对象的数组。用户定义对象的数组实例化后,您可以用关联对象的实例加载该数组。”之后,您可以使用适当的排序算法对数组中对

我有一个包含各种信息的文本文件,但它可以归结为名称/描述/网站,然后按顺序重复,直到文件完成。我假设在将三个数据组合成一个对象后,获取该文件并对数据进行排序。我对这到底意味着什么以及如何做到感到困惑。 这是我教授的一句话,解释了该怎么做,但我不知道该怎么做。 “您可以设计和实现一个用户定义对象,该对象由三个属性值组成,必须作为一个单元组合。创建用户定义对象后,您可以实例化该用户定义对象的数组。用户定义对象的数组实例化后,您可以用关联对象的实例加载该数组。”之后,您可以使用适当的排序算法对数组中对象的实例进行排序“

这是我迄今为止创建的代码

public class Main {
    public static void main(String[] args) {
        Junk Stuff = new Junk();
    }

    public static class Junk {
        String[] list = new String[59]; //array of all the data
        String[] Names = new String[20];
        String[] Desc = new String[20];
        String[] Websites = new String[20];
        int i = 0;
        {
            File file = new File("Tutorials.txt"); //calls file to be opened
            Scanner sc = null; // scans file
            try {
                sc = new Scanner(file);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            sc.hasNextLine(); //sets while loop that while scanner is on next line of file, prints it
            for (i = 0; i <= list.length; i++) //loop to iterate thru array name = sc.nextLine();
                try {
                    Names[i] = sc.nextLine();
                    Desc[i] = sc.nextLine();
                    Websites[i] = sc.nextLine();
                } catch (NoSuchElementException e) {
                }
        }

        public String[] getNames() {
            return Names.clone();
        }

        public String[] getDesc() {
            return Desc.clone();
        }

        public String[] getSites() {
            return Websites.clone();
        }
    }

}
公共类主{
公共静态void main(字符串[]args){
垃圾=新垃圾();
}
公共静态类垃圾{
String[]list=新字符串[59];//所有数据的数组
字符串[]名称=新字符串[20];
字符串[]Desc=新字符串[20];
String[]网站=新字符串[20];
int i=0;
{
File File=new File(“Tutorials.txt”);//调用要打开的文件
Scanner sc=null;//扫描文件
试一试{
sc=新扫描仪(文件);
}catch(filenotfounde异常){
e、 printStackTrace();
}
sc.hasNextLine();//设置while循环,当扫描仪位于文件的下一行时,打印它

对于(i=0;i首先定义一个具有三个字符串属性的类“User”:name、description和website。 现在使用datatype User创建一个列表,然后从文件中读取行,创建新的用户对象并添加到列表中。 而不是根据给定的属性对此进行排序

Collections.sort(userList,(u1,u2)->u1.name.compareTo(u2.name));

我认为你的教授试图让你做的是从面向对象编程(OOP)的角度思考,并解决所谓的比较器(比较两个对象的意思)

首先,让我们讨论对象部分。您正在读取由3项组成的数据。您将其称为元组(见下图),也就是一组有意义的值

让我们定义一个对象类来存储该数据。我们可以将其称为
data
,也可以称为
Entity
,甚至可以称为
Website
(请注意,我使用的是Java的第一个大写字母约定)。无论您做什么,都要远离最终将运行它的类(您的主类)

我举了一个例子:

package eu.webfarmr;

import java.net.URL;

/**
 * Illustrate comparators
 * @author djob
 *
 */
public class Website {
    private String name;
    private String description;
    private URL website;
    
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public URL getWebsite() {
        return website;
    }
    public void setWebsite(URL website) {
        this.website = website;
    }
}
现在,您可以使用另一个类,或者甚至该类中的主方法(如果您很懒)来创建该对象的数组或列表:

public static void main(String[] args) throws MalformedURLException {
    List<Website> websites = new ArrayList<Website>();
    Website a = new Website();
    a.setName("Let's cook");
    a.setDescription("Some fascinating website");
    a.setWebsite(new URL("https://www.delscookingtwist.com"));
    Website b = new Website();
    b.setName("XACML stuff");
    b.setDescription("My personal blog");
    b.setWebsite(new URL("https://www.webfarmr.eu"));
    websites.add(a);
    websites.add(b);
}
当然,这只是一个示例,您可以更改逻辑

int eu.webfarmr.Website.compareTo(网站o)

@凌驾

将此对象与订单的指定对象进行比较。返回 与此对象相同的负整数、零或正整数 小于、等于或大于指定对象

实现者必须确保sgn(x.compareTo(y))==-sgn(y.compareTo(x)) 对于所有x和y。(这意味着x.compareTo(y)必须抛出一个 异常iff y.compareTo(x)引发异常。)

实施者还必须确保关系是可传递的: (x.compareTo(y)>0&&y.compareTo(z)>0)表示x.compareTo(z)>0

最后,实现者必须确保x.compareTo(y)==0 这sgn(x.compareTo(z))==sgn(y.compareTo(z)),对于所有z

强烈建议,但并非严格要求: (x.compare to(y)==0)==(x.equals(y))。一般来说,任何阶级 它实现了可比较的接口并满足此条件 应明确指出这一事实。建议使用“注: 该类具有与equals不一致的自然顺序。”

在前面的描述中,符号sgn(表达式)指定 数学符号函数,定义为返回 -1、0或1,取决于表达式的值是负、零还是正


请注意,还有许多其他比较方法。请参见。

定义一个包含三个字符串成员的类:名称、说明和网站。在阅读文件中的行时创建该类的对象,并将结果累积到该类的对象数组中。我相信我了解所提供的大部分内容,我非常高兴非常感谢您的指导。但是我对如何将从文本文件生成的数组转换为与ArrayList函数兼容感到困惑。我将所有setter/getter更改为String[]我认为这会有所帮助,但当我创建一个网站对象时,例如:List websites=new ArrayList();Website test=new Website();test.setName(Names[0]);
@Override
public int compareTo(Website o) {
    if (o == null) return 1;
    // If the names are different then return whichever is the string order
    // Consider using lower-case comparison
    if (this.getName().compareTo(o.getName())!=0) {
        return this.getName().compareTo(o.getName());
    } else {
        if (this.getWebsite().toString().compareTo(o.getWebsite().toString())!=0) {
            return this.getWebsite().toString().compareTo(o.getWebsite().toString());
        } else {
            return (this.getDescription().compareTo(o.getDescription()));
        }
    }
}