假設我們得到了一個字母 B、F、A、G 的串列,它們相互堆疊,我想列印出它們堆疊的順序。例如,如果給我的資訊是:
AG / FB / AB / AF / GB / GF
其中符號 - 表示“位于之上”(因此 A 在 G 之上,F 在 B 之上,A 在 B 之上......)然后我想基于 A、G、F、B 輸出在給定的資料上。問題是該串列是逐行讀取的,因此在讀取第一行后,預期輸出為 A、G,直到讀取其他行并更新預期輸出。我的第一直覺是使用堆疊,但隨后我需要大量的彈出和推送操作,這會很麻煩,因為最好的資料結構可以讓我在字母之間切換位置或自由移動東西,而樹似乎是最好的選擇但是這將如何實施呢?
uj5u.com熱心網友回復:
我會使用有向圖。JDK中沒有有向圖類,但是實作它的庫很多(列舉
一旦你的有向圖被創建,并且你確保它沒有回圈(例如,你沒有定義 AB、BC、CA,這會創建一個回圈),那么排序只是一個撰寫具有以下邏輯的比較器的問題:
- 如果 o1 == o2 回傳 0;
- 如果 o1 連接到 o2 回傳 -1;
- 如果 o1 未連接到 o2,則回傳 1;
uj5u.com熱心網友回復:
您可以使用這些對來構造一個比較器,如下所示:
Set<List<String>> pairs = Arrays.stream(order.split(" / "))
.map(p -> p.split("-"))
.map(Arrays::asList)
.collect(Collectors.toSet());
Comparator<String> compare = (a, b) ->
pairs.contains(Arrays.asList(a, b)) ? -1 :
pairs.contains(Arrays.asList(b, a)) ? 1 :
0;
然后使用它以您想要的任何結構對您的輸入進行排序。
Ideone 演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/455088.html
上一篇:這個日期“2021-08-03T04:10:07.502-0700”是什么日期格式?
下一篇:Java無法獲取檔案的相對路徑
