2016-11-18 27 views
2

我對編程還很陌生,所以我很抱歉如果我讓你面對手掌。Java string arrayList:按降序排列元素(如數學中的多項式)

現在,我試圖在Java中創建括號擴展器。目前的程序已經可以擴大括號,但它不能簡化結果,因爲這些術語不是按降序排列的。我明白你可以嘗試添加這些術語,而不必通過比較每個元素中包含的變量來對它們進行重新排序。但是,我希望程序像「人」一樣「展示作品」,所以我需要按降序排列條款。

爲此,我想創建一個方法,給定一個字符串arrayList,重新排列元素,使其在數學中的多項式降序排列。

如果任何變量都有指數,則該變量只是重複到指數的數字。 例如:

X^2 = XX, 
a^3 = aaa, 
Z^5 = ZZZZZ 

此外,不會有負指數也不括號。 所有元素開頭都有+或 - (之後沒有其他操作符)。 所有元素都有一個係數,即使它是1. 大寫字母比小寫字母的重要性要高,只有數字的元素應該重新定位到最後。

我忘記了那個數學詞,但是這些詞應該按照A的利益排序,然後B以此類推,直到Z,然後是a,b,c,...等等(我的意思是,術語大多數A來第一,B第二,C第三...直到z)

係數和運算符應該被忽略。

例如,如果輸入的是這樣的:

[-1b,+3XX,-4AA,+1aaa,+20CCa,-9ABa,-9ABaa,+20CCCa,+3BBX,+1aab,+10] 

然後我想該方法返回的ArrayList中,如:

[-4AA,-9ABaa,-9ABa,+3BBX,+20CCCa,+20CCa,+3XX,+1aaa,+1aab,-1b,+10] 

我非常堅持在這裏。任何幫助將不勝感激。如果我沒有足夠清楚地描述我的問題,請告訴我。我會澄清。

我相信wolfram alpha已經有括號擴展功能。但是,我仍然想要做到這一點。

如果有人能幫助我,這將是驚人的。提前致謝!

+0

對不起,我在arrayList的例子中有一個錯誤...現在它應該被修復 – Vizor

+0

到目前爲止,你有什麼代碼,即使它不工作? –

+1

我完全不理解你的問題,但在我的理解中,它看起來像你只是想根據某種排序關係對列表進行排序。爲此,請查看[Comparator](https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html)和[Collections.sort](https://docs.oracle.com .com/javase/8/docs/api/java/util/Collections.html) – lwi

回答

3

你有幾個問題需要挑戰單獨處理:

  1. 如何解析類似-1b到我能處理的格式?
  2. 如何按自定義排序規則排序?

對於第一部分,您的規則是非常明確的,格式非常簡單。這非常適合使用正則表達式來解析它:

此外,不會有負指數和括號。所有元素開頭都有+或 - (之後沒有其他操作符)。所有元素都有一個係數,即使它是1。

因此,一個良好的正則表達式的格式可能是:

([-+]\d+)(\w+)? 

這將導致兩個「捕獲組」。第一個是數字部分,第二個是可選的重複字符串部分。

分解每次進入這兩個獨立的部分後,這是很容易拿出一套規則來確定排序順序:

  1. 如果他們兩人都是數(只具有第一部分),然後按數字排序
  2. 如果其中一個是數字,另一個是字母,則對數字進行排序。
  3. 如果兩者都有數字和字母,請按照字母進行排序,只使用普通的字符串排序。

一個簡單的方法做的自定義排序是寫一個自定義的Comparator類將被用來作爲參數傳遞給sort功能。結合上面介紹的所有想法可能是這個樣子:

public class PolynomialComparator implements Comparator<String> { 

    private static Pattern pattern = Pattern.compile("([-+]\\d+)(\\w+)?"); 

    @Override 
    public int compare(String s1, String s2) { 
     if (s1 == null) throw new NullPointerException("s1"); 
     if (s2 == null) throw new NullPointerException("s2"); 

     int compare = 0; 

     Matcher m1 = pattern.matcher(s1); 
     Matcher m2 = pattern.matcher(s2); 

     if (!m1.matches()) throw new IllegalArgumentException("Invalid Polynomial format: " + s1); 
     if (!m2.matches()) throw new IllegalArgumentException("Invalid Polynomial format: " + s2); 

     int n1 = Integer.parseInt(m1.group(1)); 
     int n2 = Integer.parseInt(m2.group(1)); 

     String p1 = m1.group(2); 
     String p2 = m2.group(2); 

     if (p1 == null && p2 == null) { // Rule #1: just compare numbers 
      compare = n2 - n1; 
     } else if (p1 == null) { // Rule #2: always sort number last 
      compare = 1; 
     } else if (p2 == null) { // Rule #2: always sort non-number first 
      compare = -1; 
     } else { // Rule #3: compare the letters 
      compare = m1.group(2).compareTo(m2.group(2)); 
     } 

     return compare; 
    } 
} 

最後,將其結合在一起,這裏是一個簡單的程序,正確排序使用此Comparator(與你的第二個例外和您提供的例子我相信這是錯的在你的榜樣第三項):

public static void main(String args[]){ 
    String input = "[-1b,+3XX,-4AA,+1aaa,+20CCa,-9ABa,-9ABaa,+20CCCa,+3BBX,+1aab,+10]"; 
    String[] array = input.substring(1, input.length() - 1).split(","); 
    Arrays.sort(array, new PolynomialComparator()); 
    System.out.println("[" + String.join(",", array) + "]"); 
} 

OUTPUT: [-4AA,-9ABa,-9ABaa,+3BBX,+20CCCa,+20CCa,+3XX,+1aaa,+1aab,-1b,+10] 

希望你可以花一些時間,通過這種行走,並學習一些想法,這將有助於你對你的方式。乾杯!

+0

我現在不能在電腦上......但只要我有機會,我會盡力!謝謝! – Vizor

+0

實際上第二和第三個例子是正確的...因爲第二和第三個元素具有相同數量的「A」和「B」,所以元素的順序歸結爲「a」的數量。由於第三個元素有更多的「a」,它需要在第二個元素前面。有什麼辦法可以做到嗎? – Vizor

+1

不要緊......基於你的幫助,我能夠拿出正確的設置。 – Vizor