我有两个列表A和B.我想找出A中与listB元素匹配的元素索引.像这样的东西:
ArrayList listA = new ArrayList();
listA.add(1);listA.add(2);listA.add(3);listA.add(4);
ArrayList listB = new ArrayList();
listB.add(2);listB.add(4);
ArrayList listC = new ArrayList();
for(int i=0; i<listB.size();i++) {
int element = listB.get(i);
for(int j=0; j<listA.size(); j++) {
if(listA.get(j) == element) listC.add(j);
}
}
Run Code Online (Sandbox Code Playgroud)
我想这是一个难看的方式.找到与B中所有元素匹配的A的所有索引的最佳方法是什么?我相信在集合api中存在一个名为containsAll的方法 - 不要认为它返回匹配的索引.
我是Android的新手.我做了搜索,但在Android中找不到像iOS的NSdictionary那样的工作.例如在iOS中,我可以像这种格式一样创建SIMPLE字典数组
Array
idx1: [objA1 for keyA],[objB1 for keyB],[objB1 for keyC]
idx2: [objA2 for keyA],[objB2 for keyB],[objB2 for keyC]
idx3: [objA3 for keyA],[objB3 for keyB],[objB3 for keyC]
Run Code Online (Sandbox Code Playgroud)
我知道我可以创建类似于android中的字符串数组
<string-array name="list_obj1">
<item>ObjA1</item>
<item>ObjB2</item>
<item>ObjC3</item>
</string-array>
<string-array name="list_obj2">
<item>ObjB1</item>
<item>ObjB2</item>
<item>ObjB3</item>
</string-array>
<string-array name="list_obj3">
<item>ObjC1</item>
<item>ObjC2</item>
<item>ObjC3</item>
</string-array>
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果有别的用于创建AN字典中的Android阵列一样的iOS.
谢谢您的帮助.
我有兴趣迭代(re:查找和替换目的),说:
List<String> someList = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)
someList已经在早期的方法中填充了,并且只包含几个元素,称之为[a:bX,b:Xc],
感兴趣的查找和替换字符串,例如:
String someString = "X";
String otherString = "Y";
String contentsTBD = "";
Run Code Online (Sandbox Code Playgroud)
现在,理想情况下我认为我可以像这样迭代someList:
public void readAndReplace() {
for (int i = 0; i < someList.size(); i++) {
if (someList.get(i).contains(someString)) {
someList.get(i).replace(someString, otherString);
} else {
++i;
}
}
System.out.print(someList);
}
Run Code Online (Sandbox Code Playgroud)
其中打印输出应为:
[a:bY, b:Yc]
Run Code Online (Sandbox Code Playgroud)
然后,我认为这可能有效:
public void readAndReplace() {
for (String s : someList) {
contentsTBD += s;
}
for (int i = 0; i < contentsTBD.length(); i++) {
if (contentsTBD.contains(someString)) {
contentsTBD.replaceAll(someString, …Run Code Online (Sandbox Code Playgroud) 我正在尝试将以下数组行更改为以相同方式运行的 ArrayList:
private String[] books = new String[5];
Run Code Online (Sandbox Code Playgroud)
我把它改成了这个,但它不能正常工作:
private ArrayList<String>(Arrays.asList(books))
Run Code Online (Sandbox Code Playgroud)
我以为这就是创建 ArrayList 的方式
我需要存储一个大型自然语言词典 - 最多120,000,具体取决于语言.这些需要保存在内存中,因为分析表明利用阵列的算法是系统中的时间瓶颈.(它本质上是一种拼写检查/自动更正算法,但细节并不重要.)在具有16MB内存的Android设备上,与Java相关的内存开销String导致我们的空间不足.请注意,每个String都有一个与之相关的38字节开销,这会产生高达5MB的开销.
乍一看,一个选项是替代char[]的String.(或者甚至byte[],因为UTF-8在这种情况下更紧凑.)但同样,内存开销是个问题:每个Java数组都有32字节的开销.
另一种替代方法ArrayList<String>是创建一个具有相同接口的类,该类在内部将所有字符串连接成一个巨大的字符串,例如表示为单个字符串,byte[]然后将偏移存储到该巨大的字符串中.每个偏移量将占用4个字节,从而提供更节省空间的解决方案.
我的问题是a)是否有任何其他解决问题的方法,同样低开销*和b)是现成的任何解决方案吗?通过Guava,trove和PCJ集合库搜索没有任何结果.
*我知道可以将开销降到4字节以下,但收益递减.
NB.是否支持在HotSpot JVM中删除压缩字符串?表明JVM选项-XX:+UseCompressedStrings在这里没有帮助.
我试图从ArrayList中删除一个对象,但我不断收到IndexOutOfBounds错误.现在有很多信息可用,为什么在删除时迭代 ArrayList 时会发生这种情况,但是我没有这样做.例:
ArrayList<Character> a = new ArrayList<Character>();
a.add('A');
a.add('B');
a.add('C');
System.out.println(a);
a.remove('A');
System.out.println(a);
Run Code Online (Sandbox Code Playgroud)
打印[A, B, C]然后失败:
java.lang.IndexOutOfBoundsException: Index: 65, Size: 3
at java.util.ArrayList.rangeCheck(ArrayList.java:635)
at java.util.ArrayList.remove(ArrayList.java:474)
at b.<init>(b.java:23)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at bluej.runtime.ExecServer$3.run(ExecServer.java:746)
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
编辑澄清这个问题不是一个重复这个问题:
这里发生的具体问题与迭代时删除元素时的常见问题无关.它更多是由重载的ArrayList remove方法和java 的自动类型转换char引起int的.
另一个问题的答案中没有涉及这方面.
我有一个大学作业,要求我从 .csv 文件中获取数据,并以三种不同的方法读取、处理和打印它。这些说明要求我将数据读入数组列表中,我为此编写了一些代码,但我不确定我是否正确完成了操作。有人能帮我理解我应该如何将文件读入数组列表吗?
我的代码:
public void readData() throws IOException {
int count = 0;
String file = "bank-Detail.txt";
try {
BufferedReader br = new BufferedReader(new FileReader(file));
String line = "";
while ((line = br.readLine()) != null) {
bank.add(line.split(","));
String[][] v = (String[][]) bank.toArray(new String[bank.size()][12]);
}
} catch (FileNotFoundException e) {
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个table扩展的类ArrayList.在其中,我希望能够创建一个map采用lambda表达式并返回table带有映射值的new 的方法.我也想这样做filter.我使用地图和过滤很多,我不喜欢一遍又一遍地输入整个东西.
public abstract class Table<E extends Element> extends ArrayList<E> {
// a lot of other stuff.
public Table<E> map(/*WHAT DO I PUT HERE?*/ mapper) {
return this.stream().map(mapper).collect(/*WHAT DO I PUT HERE?*/);
}
public Table<E> filter(/*WHAT DO I PUT HERE?*/ predicate) {
return this.stream().filter(predicate).collect(/*WHAT DO I PUT HERE?*/);
}
}
Run Code Online (Sandbox Code Playgroud)
我仍在试图找出泛型.也许有更好的方法.我不知道.我曾尝试复制原始代码中的内容ArrayList,但我尝试的所有内容似乎都会产生新的问题.
我有一个名称数组列表,我想查看重复的值(如果存在)并打印该值。问题是我对是否使用 contains 方法感到困惑,下面的代码不起作用。
ArrayList<String> list=new ArrayList();
list.add("Sagio Mane");
list.add("Karius");
list.add("Mo Salah");
list.add("Firmino");
list.add("Lovren");
list.add("Steven Gerrard");
list.add("Karius");
list.add("Mo Salah");
for(int i =0; i < list.size(); i++) {
if list.contains(list.get(i)) {
System.out.println(list.get(i)+" is duplicated")
}
}
Run Code Online (Sandbox Code Playgroud)
这应该打印“karius is duplicated”
我想合并两个不同类型的列表并创建另一个包含来自两个列表的数据的列表。此外,合并应该只在标识符匹配时发生(如两个列表中的 id 匹配)
Employee(val employeeId: Int,
val employeeName: String,
val address: String)
LaptopInfo(val laptopId: Int,
val employeeId: String,
val team: String)
EmployeeLaptopInfo(val laptopId: Int,
val employeeId: String,
val employeeName: String,
val address: String)
Run Code Online (Sandbox Code Playgroud)
所以有Employeeand 的列表,LaptopInfo我想添加 EmployeeLaptopInfo 到List<EmployeeLaptopInfo>只有当两个列表中的 employeeId 匹配时
val employeeLaptopInfoList = mutableListOf<EmployeeLaptopInfo>()
val employeeIds = employeeList.map { it.employeeId }.toSet()
lapTopInfoList.filter { employeeIds.contains(it.employeeId) }
.map {
val employeeLaptopInfo = EmployeeLaptopInfo(it.laptopId, laptopId.employeeId, "can't get info", "can't get info")
employeeLaptopInfoList.add(employeeLaptopInfo)
}
Run Code Online (Sandbox Code Playgroud)
但是这样我就不会从两个列表中获得详细信息。有没有办法在不使用 for 循环的情况下以有效的方式做到这一点。