Java:创建一个类的列表(list<;class>;),并对其进行迭代
我来自C#背景,我正试图弄清楚如何像在C#中使用类那样使用它们。如果这不是在Java中使用它们的方法,我想知道正确的方法 基本上,我想做的是:Java:创建一个类的列表(list<;class>;),并对其进行迭代,java,data-structures,Java,Data Structures,我来自C#背景,我正试图弄清楚如何像在C#中使用类那样使用它们。如果这不是在Java中使用它们的方法,我想知道正确的方法 基本上,我想做的是: 创建一个列表并用数据填充。 反复浏览所述列表 以下是我迄今为止的尝试: 是我想要的类对象: public class ClassName { public ClassName(String _str, int _a, int _b, int _c, int _d, long _e) { str = _str;
public class ClassName
{
public ClassName(String _str, int _a, int _b, int _c, int _d, long _e)
{
str = _str;
a = _a;
b = _b;
c = _c;
d = _d;
e = _e;
}
public String str;
public int a;
public int b;
public int c;
public int d;
public long e;
}
// Why would I use this instead of List<T>?
ArrayList<ClassName> hList = new ArrayList<ClassName>();
hList.add(new ClassName("string", 1, 2, 3, 4, 2432342322));
public class ClassName
{
public ClassName(String _str, int _a, int _b, int _c, int _d, long _e)
{
str = _str;
a = _a;
b = _b;
c = _c;
d = _d;
e = _e;
}
public String str;
public int a;
public int b;
public int c;
public int d;
public long e;
}
构造函数类名(String,int,int,int,int,long)未定义
…这令人困惑。Eclipse要求我添加我已经添加的内容。当我选择“快速修复”选项时,它与上面的构造函数做了相同的事情,但是没有type=type
的东西。也许我处理得不对
假设这是一种正确的迭代方式,下面是我认为有效的方法:
for (int i = 0; i < hList.size(); i++)
{
System.out.println(hList[i].currentDate);
}
for (int i = 0; i < hList.size(); i++)
{
System.out.println(hList[i].currentDate);
}
for(int i=0;i
那么,如何在Java中创建一个适当的列表并对其进行迭代呢?您在类的构造函数中添加了一个额外的int,它需要1个字符串、3个int和1个long,您试图用1个字符串、4个int和1个long创建它。 迭代列表的方法是
for (ClassName element:hList){
//something meaningful here
System.out.println(element.currentDate);
}
您还可以使用Java8功能:)
我
用下划线命名并不常见。我建议改用这个
。而且,String
是大写的,大括号通常位于行的末尾
public ClassName(String str, int a, int b, int c, long d) {
this.str = str;
this.a = a;
this.b = b;
this.c = c;
this.d = d;
}
二,
三,
构造函数类名(String,int,int,int,int,long)
未定义
您的构造函数有三个int
s和一个long
;您试图通过四个int
s和一个long
四,
假设这是一种正确的迭代方式,下面是我认为有效的方法:
for (int i = 0; i < hList.size(); i++)
{
System.out.println(hList[i].currentDate);
}
for (int i = 0; i < hList.size(); i++)
{
System.out.println(hList[i].currentDate);
}
如果您确实想要i
,请将[i]
更改为。获取(i)
。Java没有运算符重载,因此[]
仅在数组上可用,而不是像List
这样的类或接口
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i).currentDate);
}
for(int i=0;i
您要传递4个int,而构造函数附带使用3个int参数,ArrayList hList=new ArrayList()代码>通常按List hList=new ArrayList()执行代码>。这使您的代码更加灵活,因为您不必依赖于List
@njzk2的特定实现,所以有一个论点是双向的,但我看到的是List
通常是首选的。就我个人而言,我觉得在合理的情况下保持代码通用性的习惯超过了限制超出需要的好处。@njzk2我不同意。返回List
比返回ArrayList
要好。它使API保持通用性,并允许您在不影响调用方的情况下更改要返回的列表的具体类型。从上下文中应该清楚地知道列表是只读的还是可写的,如果不是,API文档应该指定它。这就是处理可选方法的方式,而不是通过避免收集
和列表
@njzk2您的最后一个括号可能是我们采取不同做法的根本原因:列表
有缺陷。我同意你的看法。它应该保证O(1)个随机访问,链接列表
应该扩展集合
,而不是列表
。在我看来,事情就是这样。我认为一个非O(1)<代码> GET()/<代码>方法被打破。因此,当我希望允许调用者按索引查找项目而不必担心速度时,我返回List
。这样我就可以从ArrayList
自由切换到Arrays.asList()
到番石榴的ImmutableList
。我认为这个策略是有效的,因为我知道没有人使用过LinkedList
。所以这就是Java的foreach循环!非常感谢。我确实考虑过使用this.var
,但我不确定它是否有效。也许我应该试一下!让我们假设我确实需要索引(我想知道如何正确地使用这两个索引),当我使用hList[I].var
时,我得到了这样一个错误:表达式的类型必须是数组类型,但它解析为ArrayList
,在java中,你不能通过这样的索引访问列表的后备数组(假设它甚至是数组)。你必须使用list.get(i)
而不是list[i]
。确保你使用的是java.util.list
而不是java.awt.list
。在C和java之间的翻译中,另一件经常丢失的事情是java的list
相当于C的IList
。这是一个接口而不是一个类。既然你在教授约定(投票赞成),你也可以提到公共字段是不被鼓励的。您的println(item)
应该是println(item.currentDate)
以与示例一致,或者println(item.getCurrentDate())
如果您决定在示例中使用访问器。Nit:1长。对不起,我要说的是,它们是不同类型的。
for (ClassName item: list) {
System.out.println(item.currentDate);
}
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i).currentDate);
}