我正在编写一个程序,它将查询MS访问数据库,将查询作为结果集返回,然后我想最终将该结果集转换为String数组,以便我可以将它传递给Swing JComboBox的构造函数 - 所以ComboBox将列出查询返回的项目.
我已经能够将结果集的行存储到ArrayList中,然后将该ArrayList转换为对象数组,组合框将列出正确的项目,但作为对象.我根本无法将ArrayList转换为String数组.有谁知道这是否可能?这是我的一些代码......
// Convert the Resultset into an array list
public ArrayList<ArrayList<Object>> Results2Array(ResultSet rs) throws SQLException {
ResultSetMetaData metaData = rs.getMetaData();
int columns = metaData.getColumnCount();
ArrayList<ArrayList<Object>> al = new ArrayList<ArrayList<Object>>();
while (rs.next()) {
ArrayList<Object> record = new ArrayList<Object>();
for (int i = 1; i <= columns; i++) {
Object value = rs.getObject(i);
record.add(value);
}
al.add(record);
}
return al;
}
// Convert ArrayList to Object Array, and pass into GUI
ArrayList<String> Locations = new ArrayList<String>();
ArrayList<String> Months = …Run Code Online (Sandbox Code Playgroud) 我有一个问题.当我尝试将"相同"对象两次添加到ArrayList时会发生什么."相同"是指单个类的对象,使用equals()和hashCode()标识为相同.它对于大多数成员变量具有不同的值,并且可能是从不同的线程创建的,但对于equals()和hashCode(),它们是"相同的".第二个对象是否会替换第一个对象?
另外,如果两个线程试图将这些对象完全同时添加到ArrayList会发生什么?这甚至可能吗?如果是,会发生什么?
谢谢!:-)
[编辑]感谢所有的答案!我应该使用synchronizedList,而不是使用"synchronize(list){}"吗? - >我读了docs,即使是使用synchronizedList,也可以使用迭代同步(list)
[EDIT2] synchronizedList可以声明为成员变量吗?我试过了,但它没有用.
我想要明确一些事情:当使用arraylist时,它以10个元素的大小开始.如果需要自动增加,它会将整个arrayList重写为2/3更大.
如果我正在查看最终大小为50-120的列表,那么更好的是:
谢谢
我知道这已经在这里一遍又一遍地讨论,但我尝试过的所有例子都没有为我工作.
我得到了什么
我从Android访问呼叫日志,我得到了所有呼叫的列表.当然,在这里我得到了很多重复.首先我制作一份清单
List<ContactObject> lstContacts = new ArrayList<ContactObject>();
Run Code Online (Sandbox Code Playgroud)
然后我在其中添加对象
While (get some record in call log)
{
ContactObject contact = new ContactObject();
contact.SetAllProperties(......)
lstContacts.add(contact);
}
Set<ContactObject> unique = new LinkedHashSet<ContactObject>(lstContacts);
lstContacts = new ArrayList<ContactObject>(unique);
Run Code Online (Sandbox Code Playgroud)
Contact Object类很简单
public class ContactObject {
public ContactObject() {
super();
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof ContactObject))
return false;
return this.lstPhones == ((ContactObject) obj).getLstPhones();
}
@Override
public int hashCode() {
return lstPhones.hashCode();
}
private long Id;
private String name;
private List<String> lstPhones; …Run Code Online (Sandbox Code Playgroud) 首先让我说我不能在这里放任何代码,因为我的笔记本电脑上的互联网不能工作,所以我通过手机发布这个.好吧问题是我说有两个类:第一和第二类.第一类有一个ArrayList属性,它从类2中调用void方法并将其ArrayList作为参数传递.现在该方法初始化另一个方法ArrayList并使其等于我传递的参数并对该新方法进行更改ArrayList.有趣的是,即使我作为参数传递的原始ArrayList也在改变.可能的原因是什么?
我有一个ArrayList包括几个时间戳的目标是找到第一个和最后一个元素的差异ArrayList.
String a = ArrayList.get(0);
String b = ArrayList.get(ArrayList.size()-1);
long diff = b.getTime() - a.getTime();
Run Code Online (Sandbox Code Playgroud)
我也将类型转换为int但仍然给我一个错误The method getTime is undefined for the type String.
附加信息 :
我有一个A类,其中包括
String timeStamp = new SimpleDateFormat("ss S").format(new Date());
Run Code Online (Sandbox Code Playgroud)
并且有一个B类有一个方法 private void dialogDuration(String timeStamp)
和dialogueDuration方法包括:
String a = timeSt.get(0); // timeSt is an ArrayList which includes all the timeStamps
String b = timeSt.get(timeSt.size()-1); // This method aims finding the difference of the first and the last elements(timestamps) …Run Code Online (Sandbox Code Playgroud) 我有这段代码:
while((line=br.readLine())!=null)
{
String Words[]= line.split(" ");
outputLine = SomeAlgorithm(Words);
output.write(outputLine);
}
Run Code Online (Sandbox Code Playgroud)
正如您在上面的代码中所看到的,对于输入文件中的每一行,我正在读取一行,在其上运行一些算法,它基本上修改了该行,然后将输出行写入某个文件.
文件中有9k行,整个程序在我的机器上花了3分钟.
我想,好吧,我正在为算法的每个(行)运行做2个I/O. 所以我做了大约18k I/O. 为什么不首先收集所有行ArrayList,然后遍历列表并在每行上运行算法?还将每个输出收集到一个字符串变量中,然后在程序结束时写出所有输出一次.
这样,我整个程序总共有2个大I/O(18k小文件I/O到2个大文件I/O).我觉得这会更快,所以我写了这个:
List<String> lines = new ArrayList<String>();
while((line=br.readLine())!=null)
{
lines.add(line); // collect all lines first
}
for (String line : lines){
String Words[] = line.split(" ");
bigOutput+=SomeAlgorithm(Words); // collect all output
}
output.write(bigOutput);
Run Code Online (Sandbox Code Playgroud)
但是,这件事需要7分钟!
那么,为什么循环遍历ArrayList要慢于逐行读取文件?
注意:通过readLine()收集所有行并写入bigOutput都只需要几秒钟.SomeAlgorithm()也没有变化.所以,当然,我认为罪魁祸首是for (String line: lines)
更新:正如下面各种评论中所提到的,问题不在于ArrayList遍历,而是使用+ =累积输出的方式.转移到StringBuilder()确实给出了比原始结果更快的结果.
我有一个列表,它是我班上的私人成员。我使用 getter 和 setter 来获取和设置值。SOnar 引发错误 - 不应直接存储或返回可变成员。
例如:ABC 和 DEF 是两个类。
class ABC{
private List<DEF> defList;
public List<DEF> getDefList() { return defList; }
public void setDefList(List<DEF> defList) { this.defList = defList; }
Run Code Online (Sandbox Code Playgroud)
经过大量的谷歌搜索和搜索,我了解到可以按如下方式更改 getter:
public List<DEF> getDefList() { return new ArrayList<>(defList); }
Run Code Online (Sandbox Code Playgroud)
当我尝试类似地使用 setter 时,
public void setDefList(List<DEF> defList) { this.defList.addAll(defList); }
Run Code Online (Sandbox Code Playgroud)
然后变量开始显示
'private field 'defList' is never assigned.
Run Code Online (Sandbox Code Playgroud)
我可以知道当它是一个列表时的正确方法吗(另一个类的列表)
注意:Prasad Karunagoda 和 Leo Aso 的答案都有效。我不能将两者都标记为已接受的答案。所以在这里做个笔记
如何在 Kotlin 中转换Array<String>为ArrayList<String>?
var categoryList : ArrayList<String>?=null
val list = arrayOf("None", "ABC")
categoryList = ArrayList(Arrays.asList(list))
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
错误
Type inference failed. Expected type mismatch: inferred type is kotlin.collections.ArrayList<Array<String>!> /* = java.util.ArrayList<Array<String>!> */ but kotlin.collections.ArrayList<String>? /* = java.util.ArrayList<String>? */ was expected
Run Code Online (Sandbox Code Playgroud) 假设我有一个可迭代对象(可以是映射(键)、列表、集合等),并且希望使用 Map() 将其转换为具有函数 f 的另一个可迭代对象。然而,我希望 f 在转换后仅在满足条件时返回一个值。
List<int> a = [1,2,3,4,5,6];
List<int> b = a.map((e) => (e % 2 == 0) ? e * 10 : null);
assert(b == [20,40,60]);
Run Code Online (Sandbox Code Playgroud)
然而,这会返回一个错误,就像map中带有mapEntry的任何类似的等效项一样,例如:
Map<int, String> a = {1:a, 2:b, 3:c, 4:d, 5:e, 6:f};
Map<int, String> b = a.map((k,v) => (k % 2 == 0) ? MapEntry(k*10,v) : null);
assert(b.keys.toList<int>() == [20,40,60]);
Run Code Online (Sandbox Code Playgroud)
当然,有一些方法可以通过牺牲效率和简洁性来解决这个问题,即在映射值之前或之后循环遍历它以过滤掉不需要的值。例如:
List<int> b = a.where((e) => e%2).map((e) => e * 10);
List<int> b = a.map((e) => e * 10).where((e) => e%2); …Run Code Online (Sandbox Code Playgroud)