在不使用索引的情况下打印出ArrayList中的特定行

时间:2018-07-30 19:21:43

标签: java arraylist contains

我希望能够打印出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”的行选择要打印的行。这怎么可能?

5 个答案:

答案 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的hashCodeequals方法,它们会再次出现在这里,并且通常将复杂度降低到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,以便在不使用索引的情况下按条件获取想要的元素。

TestarIgen

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