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()))

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
}

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)
);
}
添加回答
舉報