亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

比較每個列表中每個索引的項目

比較每個列表中每個索引的項目

婷婷同學_ 2023-06-21 16:40:03
我有一個字符串列表的 arrayListArrayList<List<String>> temp = new ArrayList<List<String>>();現在,假設我們有 3 個列表,例如:列表 1:[3,8,15,98]列表 2:[3,4,21,98]列表 3:[5,4,76,90]我只想打印最小的列表。我的意思是具有最小升序的列表。例如,如果我們采用三個列表 abose :在索引 0 處:列表 1 和 2 的項目 = 3清單 3 的項目 = 53<5 所以我不會打印列表 3在索引 1 處:列表項 1 = 8列表 2 的項目 = 44<8 所以我必須打印列表 2事實上,我嘗試比較每個索引處每個列表的項目。   ArrayList<List<String>> temp = new ArrayList<List<String>>();//...//...        for(int i=0; i<temp.size()-1; i++) {            for(int j=0; j<temp.get(i).size(); j++) {                                                int min = Integer.valueOf(temp.get(i+1).get(j));                if(Integer.valueOf(temp.get(i).get(j)) < min) {                    min = Integer.valueOf(temp.get(i).get(j));                }else if(Integer.valueOf(temp.get(i).get(j)) >=min) {                    temp.get(i).remove(j);                }            }但該方法似乎不是最好的方法。你有什么想法嗎?
查看完整描述

3 回答

?
元芳怎么了

TA貢獻1798條經驗 獲得超7個贊

這是使用 Java Streams 的另一種方法:


List<Integer> list1 = Arrays.asList(3, 8, 15, 98);

List<Integer> list2 = Arrays.asList(3, 4, 21, 98);

List<Integer> list3 = Arrays.asList(5, 4, 76, 90);


Optional<List<Integer>> result = Stream.of(list1, list2, list3)

? ? .sorted((a, b) -> IntStream.range(0, a.size())

? ? ? ? .map(i -> Integer.compare(a.get(i), b.get(i)))

? ? ? ? .filter(i -> i != 0)

? ? ? ? .findFirst()

? ? ? ? .orElse(0))

? ? .findFirst();


System.out.println(result);

這就是它的工作原理。


我們對列表進行流式傳輸,使用某個特定值對流進行排序Comparator,然后找到第一個出現的位置。它返回一個Optional,以防Optional.empty()您不提供任何列表,因此自然不存在“最小”。


排序函數執行以下操作。它遍歷列表的所有索引,并將兩個列表中該位置的元素相互比較。它繼續行走,直到比較返回非零值。這意味著該位置的元素不同。如果所有位置的比較都返回 0,則意味著列表之間沒有區別(前提是所有列表的長度都相等)。


如果你想處理長度不等的列表,你可以相應地重寫排序函數。它遍歷兩個列表中有效的所有索引。如果所有元素都相等,則選擇最短的列表。


(a, b) -> IntStream.range(0, Math.min(a.size(), b.size()))

? ? .map(i -> Integer.compare(a.get(i), b.get(i)))

? ? .filter(i -> i != 0)

? ? .findFirst()

? ? .orElse(Integer.compare(a.size(), b.size()))



查看完整回答
反對 回復 2023-06-21
?
大話西游666

TA貢獻1817條經驗 獲得超14個贊

任何比較算法都可以使用 Java 比較器輕松編寫。但首先讓我們假設您正在比較整數列表而不是字符串列表,因為這就是您正在做的。如果您的原始數據以字符串格式呈現,那么顯然您必須將數據轉換為數字類型,以便將它們作為數字進行比較。


您可以擁有一個 TreeSet,它可以通過使用自定義比較算法來保留其元素的順序。


您可以編寫一個可以通過多個對象屬性進行比較的比較器。當假設您想按名字和第二個名字(按第 1 列,然后按第 2 列)比較員工列表時,這很有用。在我們的例子中,我們可以通過第一個索引進行比較,然后通過第二個索引進行比較,然后通過第三個索引進行比較,并且該鏈可以根據需要深入到您的列表中。


public static void main(String[] args) {

        List<Integer> list1 = Arrays.asList(3,8,15,98);

        List<Integer> list2 = Arrays.asList(3,4,21,98);

        List<Integer> list3 = Arrays.asList(5,4,76,90);


        int comparisonLength = 4;


        Comparator<List<Integer>> comparator = Comparator.comparing(list -> list.get(0));

        for(int i = 1; i< comparisonLength; i++) {

            final int comparedIndex = i;

            comparator = comparator.thenComparing(list -> list.get(comparedIndex));

        }


        TreeSet<List<Integer>> treeSet = new TreeSet<>(comparator);


        treeSet.add(list1);

        treeSet.add(list2);

        treeSet.add(list3);


        System.out.println(treeSet.iterator().next()); //prints the first element in the collection

    }


查看完整回答
反對 回復 2023-06-21
?
弒天下

TA貢獻1818條經驗 獲得超8個贊

public static void main(String[] args) {

        List<String> l1 = Arrays.asList("3", "8", "15", "98");

        List<String> l2 = Arrays.asList("3", "4", "21", "98");

        List<String> l3 = Arrays.asList("5", "4", "76", "90");

        ArrayList<List<String>> list = (ArrayList<List<String>>) Stream.of(l1, l2, l3).collect(Collectors.toList());


        System.out.println(

                list.stream()

                .min(

                        (a, b) -> {

                            for (int i = 0; i < Math.min(a.size(), b.size()); i++) {

                                if (!a.get(i).equals(b.get(i))) {

                                    return Integer.parseInt(a.get(i)) - Integer.parseInt(b.get(i));

                                }

                            }

                            throw new RuntimeException();

                        }

                ).orElseThrow(RuntimeException::new)

        );

    }


查看完整回答
反對 回復 2023-06-21
  • 3 回答
  • 0 關注
  • 177 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號