我在寫一個演算法題目 其中我自己寫了個class用來封裝資料
且覆寫了比較的方法,卻不太明白問題出在哪裡
因為我直接實驗在main方法中是可以成功的
class StringIndexAndLen
{
public int index=-1;
public int len=-1;
public StringIndexAndLen(int i,int l)
{
index=i;
len=l;
}
}
其中 我希望依照index的值給陣列排序大小
這個程式我有寫成遞迴,但是 我通過打印出來確定陣列的值是正確的
但當一排序後就會有未知的數字
Arrays.sort(infoArray,(n1,n2)->n1.index-n2.index);
int count=0;
System.out.print("start:");
for(;count<infoArray.length;count++)
{
System.out.print(infoArray[count].index+" ");
}
System.out.print("end\n");
排序前:
ex1:start:3 0 6 end
ex2:start:3 12 6 end
排序後
ex1:start:0 3 6 end
ex2:start:0 6 12 end
若你希望實驗看看
public class SubstringwithConcatenationofAllWords {
public static void main(String[] args) {
Solution sol=new Solution();
String s = "barfoothefoobarman";
String[]words = new String[]{"foo","bar","the"};
sol.findSubstring(s, words);
}
}
class Solution {
public List<Integer> findSubstring(String s, String[] words) {
List<Integer>ans=new ArrayList<Integer>();
indexRecur(0,new StringIndexAndLen[words.length],ans,s,words);
return ans;
}
void indexRecur(int index,StringIndexAndLen[]infoArray,List<Integer>ans,String s, String[] words)
{
if(index==words.length)
{
//Arrays.sort(infoArray,(n1,n2)->n1.index-n2.index);
System.out.print("start:");
for(int count=0;count<infoArray.length;count++)
{
System.out.print(infoArray[count].index+" ");
}
System.out.print("end\n");
}
else
{
//CAN HELP
for(int i=0;i<s.length();i++)
{
i=s.indexOf(words[index],i);
if(i==-1)
break;
infoArray[index]=new StringIndexAndLen(i,words[index].length());
indexRecur(index+1,infoArray,ans,s,words);
}
}
}
}
class StringIndexAndLen
{
public int index=-1;
public int len=-1;
public StringIndexAndLen(int i,int l)
{
index=i;
len=l;
}
}
日安, 可以理解成你想要的Print的產出是這樣嗎
start:0 3 6 end
start:3 6 12 end
start:0 6 9 end
start:6 9 12 end
如果是的話 問題不在排序上, 而是排序後的流程, 因為排序完之後你的infoArray還會被拿來做後續的行為, 造成結果從第二組開始就不是你想要的結果
你可以試著在Sort之前把infoArray先Copy出來, 再做Sort, 並比較第二組start的運作狀態
如果還是有疑問, 思考看看index在sort前後的的改變跟他代表的意義, 或是先把單詞改成2,3,4這種不同長度的字串再看看infoArray呼叫時的變化
一、編碼風格混亂
Java 的括號是
method() {
}
而非
method()
{
}
都一致也罷
你的程式居然有兩套風格
看了非常頭疼
二、debug 能力不足
你說
但當一排序後就會有未知的數字
可是測出來並非排序的問題
簡單打印就知道
System.out.print("before: ");
for (StringIndexAndLen a : infoArray) {
System.out.print(a.index + " ");
}
System.out.println();
Arrays.sort(infoArray,(n1,n2)->n1.index-n2.index);
System.out.print("after: ");
for (StringIndexAndLen a : infoArray) {
System.out.print(a.index + " ");
}
System.out.println();
解 bug 的第一步要正確鎖定 bug 在哪!
三、未說明意圖
導致我們即使看了你整段程式碼,仍不懂你想要幹嘛
目前看到
這裡會出現矛盾,多對多怎麼知道誰是誰?
更不用說你排序了,這串 index 基本上無意義
因此說明目的非常重要
因為新手往往一開始就想錯了
後面就一路歪下去
你這個情況需要貼出題目
以及你的思路、步驟等
而不是只有說「排序」
四、改良實作
這是假設你要查出一組字詞各自在字串中的 index
public class SubstringwithConcatenationofAllWords {
public static void main(String[] args) {
Solution sol = new Solution();
String s = "barfoothefoobarman";
String[] words = new String[] { "foo", "bar", "the" };
// sol.findSubstring(s, words);
Test test = new Test();
Map<String, List<Integer>> result = test.findSubstring(s, words);
for (String word : words) {
System.out.println(word + ":");
List<Integer> indexList = result.get(word);
for (Integer index : indexList) {
System.out.println(index);
}
}
}
}
class Test {
public Map<String, List<Integer>> findSubstring(String string, String[] words) {
Map<String, List<Integer>> result = new HashMap<String, List<Integer>>();
for (String word : words) {
List<Integer> indexList = new ArrayList<Integer>();
int index = string.indexOf(word);
while (index >= 0) {
indexList.add(index);
index = string.indexOf(word, index + 1);
}
Collections.sort(indexList);
result.put(word, indexList);
}
return result;
}
}
結果: