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()));
}
}
}