我希望能够打印出ArrayList中的特定行/行,但是现在我只能打印出ArrayList中的所有行。
我有一个名为“ TestarIgen”的类,其中有变量:Kontonummer,Saldo和Kredit以及它们的get&set方法。
在Main类中,我有以下代码:
public static void main(String[] args) {
List<TestarIgen> testList = new ArrayList<>();
testList.add(new TestarIgen(1, 1, 1));
testList.add(new TestarIgen(2, 2, 2));
String titelRad = "%-10s %6s %6s\n";
String template = "%-10s %6d %6s\n";
System.out.printf(titelRad, "Kontonummer ", "Saldo ", "Kredit");
for (TestarIgen testarigen : testList) {
System.out.printf(template, testarigen.getKontoNr(), testarigen.getSaldo(), testarigen.getKredit());
}
}
我希望能够根据包含特定“ Kontonummer”的行选择要打印的行。这怎么可能?
答案 0 :(得分:4)
有多种方法可以实现这一目标,但是复杂性是一个您不能忽略的词。
第一个,也许是幼稚的解决方案是,像这样简单地搜索正确的 Kontonummer :
List <TestarIgen> testList = new ArrayList <>();
int kontonummer = 1;
for (TestarIgen testarigen : testList) {
if(testarigen.getKontoNr() == kontonummer) {
// match found
break; // stop the loop if we found a match, saves some time
}
}
此解决方案的复杂度为O(n)
,这意味着在最坏的情况下,您必须遍历列表中的所有元素。幸运的是,Java还有其他具有更好复杂性的数据结构-例如Map
。如果您曾经见过Object的hashCode
和equals
方法,它们会再次出现在这里,并且通常将复杂度降低到O(1)
。平均而言,Java只执行一项操作即可找到您要寻找的密钥。因此,更好的解决方案如下:
Map<Integer, TestarIgen> map = new HashMap<>();
for (TestarIgen testarigen : testList) {
map.put(testarigen.getKontoNr(), testarigen);
}
int kontonummer = 1;
TestarIgen value = map.get(kontonummer);
if(value != null) {
// the map contains your value
} else {
// the map does not contain your value
}
虽然在您的示例中可能无关紧要,但这是最佳实践,并且在数据集变大时很重要。
其他改进:
如何向toString
类添加TestarIgen
方法呢?然后,您的打印可以减少到以下内容:
System.out.printf(testarigen);
Java 8:
如果您喜欢使用Java 8,则可以将loop语句简化为:
testarigen.stream().filter(t -> t.getKontoNr() == kontonummer).findFirst()
.ifPresent(System.out::print);
此流的复杂度为O(n)
。另外请注意,我确实在这里使用了以前推荐的toString
方法。
答案 1 :(得分:1)
您正在描述Map
集合的需求。您可以一次遍历列表来构建它,并将其构建为:
Map <Integer, TestarIgen> map = new HashMap<>();
for(TestarIgen ti : testList){
map.put(ti.getKontoNr(), ti);
}
一旦有了它,就可以通过以下方式用Kontonummer = x
获取对应的对象:
TestarIgen obj = map.get(x);
答案 2 :(得分:1)
我可能建议使用java-8
。使用List
,您可以filter
stream
,以便在不使用索引的情况下按条件获取想要的元素。
public class TestarIgen {
private int kontonummer;
private int saldo;
private int kredit;
public TestarIgen(int kontunummer, int saldo, int kredit) {
this.kontonummer = kontunummer;
this.saldo = saldo;
this.kredit = kredit;
}
public int getKontoNr() {
return this.kontonummer;
}
public int getSaldo() {
return this.saldo;
}
public int getKredit() {
return this.kredit;
}
}
演示的内容将获取first
匹配元素。如果您想要除第一个结果以外的其他东西,则必须在代码中添加更多逻辑,但这应该可以助您一臂之力。
import java.util.ArrayList;
import java.util.List;
public class StackOverflow {
public static void main(String[] args) {
List<TestarIgen> testList = new ArrayList<TestarIgen>();
testList.add(new TestarIgen(1, 1, 1));
testList.add(new TestarIgen(2, 2, 2));
String titelRad = "%-10s %6s %6s\n";
String template = "%-10s %6d %6s\n";
System.out.printf(titelRad, "Kontonummer ", "Saldo ", "Kredit");
TestarIgen test = testList.stream().filter(t -> t.getKontoNr() == 1).findFirst().get();
System.out.printf(template, test.getKontoNr(), test.getSaldo(), test.getKredit());
}
}
结果:
Kontonummer Saldo Kredit
1 1 1
答案 3 :(得分:1)
使用Java 8和流
static void printRow(int kontoNummer, List<TestarIgen> list) {
String template = "%-10s %6d %6s\n";
list.stream()
.filter(t -> t.getKontoNr() == kontoNummer)
.findFirst()
.ifPresent(t -> System.out.printf(template, t.getKontoNr(), t.getSaldo(), t.getKredit()));
}
...
printRow(2, testList);
答案 4 :(得分:0)
这是一种使用索引的解决方案-请注意,这是一种有效搜索的方法-尽管要求(在帖子标题中)说“不使用索引”。
这使用Collections.binarySearch。请注意,List
需要根据进行搜索的属性进行排序。通过随机访问(而不是顺序搜索)获得结果。这对于搜索List
集合以进行更快的搜索可能很有用。
import java.util.*;
public class ListSearch {
public static void main(String[] args) {
List<TestarIgen> testList = new ArrayList<>();
testList.add(new TestarIgen(1, 1, 1));
testList.add(new TestarIgen(2, 2, 2));
testList.add(new TestarIgen(12, 2, 2));
testList.add(new TestarIgen(4, 2, 2));
System.out.println(testList); // unsorted list: [1-1-1, 2-2-2, 12-2-2, 4-2-2]
// Sort by Kontonummer using a Comparator
Comparator<TestarIgen> kontonummerComparator = new Comparator<TestarIgen>() {
public int compare(TestarIgen one, TestarIgen two) {
return Integer.compare(one.getKontoNr(), two.getKontoNr());
}
};
Collections.sort(testList, kontonummerComparator);
System.out.println(testList); // sorted list by Kontonummer: [1-1-1, 2-2-2, 4-2-2, 12-2-2]
// Search the list with Kontonummer using binary search
TestarIgen searchKey = new TestarIgen(4, 2, 2);
int index = Collections.binarySearch(testList, searchKey, kontonummerComparator);
System.out.println(index); // prints row index 2
System.out.println(testList.get(index)); // 4-2-2 where Kontonummer is 4!
}
}
class TestarIgen {
private int kontonummer;
private int saldo;
private int kredit;
public TestarIgen(int kontunummer, int saldo, int kredit) {
this.kontonummer = kontunummer;
this.saldo = saldo;
this.kredit = kredit;
}
public int getKontoNr() {
return kontonummer;
}
public int getSaldo() {
return saldo;
}
public int getKredit() {
return kredit;
}
public String toString() {
return kontonummer + "-" + saldo + "-" + kredit;
}
}