例如'A B C'是我的句子,我想更改所有變體中的單詞位置。如..如何更改句子中所有變體中的單詞位置
'A B C'
'A C B'
'B C A'
'B A C'
'C A B'
'C B A'
感謝ü
例如'A B C'是我的句子,我想更改所有變體中的單詞位置。如..如何更改句子中所有變體中的單詞位置
'A B C'
'A C B'
'B C A'
'B A C'
'C A B'
'C B A'
感謝ü
有兩個部分的問題。
第一部分是將輸入的句子拆分爲單詞。這是一個單獨的問題,堆棧溢出(超過100個)有很多線程顯示瞭如何完成,我假設你的問題更多地是關於排列。
第二部分是,一旦你有了單詞,你如何得到所有的排列組合。一種方法是使用分層查詢,如原始帖子下的評論中所討論的;然而,舊的解決方案似乎過於複雜。這裏是你可以用一個分層查詢做最簡單的方法:
with
test_data (str) as (
select 'alpha' from dual union all
select 'beta' from dual union all
select 'gamma' from dual
)
-- end of test data
select trim(sys_connect_by_path(str, ' ')) as perm
from test_data
where connect_by_isleaf = 1
connect by nocycle prior str is not null
;
PERM
----------------
alpha beta gamma
alpha gamma beta
beta alpha gamma
beta gamma alpha
gamma alpha beta
gamma beta alpha
我們具備的條件PRIOR STR IS NOT NULL
的唯一原因就是如此,我們在其中STR
出現與PRIOR
操作的條件。受制於CONNECT BY
中的PRIOR
運算符的列是在分層查詢中定義「週期」的列。 NOCYCLE
指令意味着我們不應該在輸出中重複使用STR
的值 - 這正是我們想要的。由於我真的不需要STR
的任何條件,我只是想與PRIOR
運營商合作,我寫了一個微不足道的條件,PRIOR STR IS NOT NULL
。所有的工作都是通過分層查詢完成的,其中NOCYCLE
,當然還有SYS_CONNECT_BY_PATH
。需要TRIM
是因爲沒有它,輸出以空格開始(SYS_CONNECT_BY_PATH
的結果)。 WHERE
條款使用CONNECT_BY_ISLEAF
是必要的,因爲我們只需要全排列,我們也不需要單個詞,以及雙詞子集的排列。 (剛離開WHERE
條款出來一看就知道做什麼。)
感謝ü@mathguy ..
WITH WORDS AS
(SELECT REGEXP_SUBSTR(P_TEXT1, '\S+', 1, LEVEL) AS WORD, LEVEL AS NUM
FROM DUAL
CONNECT BY LEVEL <= LENGTH(REGEXP_REPLACE(P_TEXT1, '\S+\s*', 'X')))
SELECT TRIM(SYS_CONNECT_BY_PATH(W.WORD, ' ')) AS PERM
FROM WORDS W
WHERE CONNECT_BY_ISLEAF = 1
CONNECT BY NOCYCLE PRIOR W.WORD IS NOT NULL
所以'A B C'' 'B A C''應該用'取代'? –
你嘗試過什麼嗎? SO不適用於「如何做到這一點」等問題。請嘗試一下,然後,如果您的代碼存在問題,請在此處發帖提問。 – Aleksej
這可以做到,但是你是否意識到如果你的輸入句子有很多單詞,你會很快得到非常非常多的行數?如果輸入有100個單詞,你知道有多大100!是什麼? (100階乘) – mathguy