2016-07-12 130 views
0

我的問題是,我想比較一些不使用字母排序的字符。 這裏是我的順序關係:一個<乙<牛逼< Q <Ç< d <è< F的如何使一個字母順序不同的字母順序的比較器的字母順序

我怎麼能創造這樣的比較?我必須寫所有的情況是這樣的:

if (char1.equals(char2)) { 
      return 0; 
     } else if (char1.equals("A")) { 
      return -1; 
     } else if (char1.equals("B") && char2.equals("A")) { 
      return 1; 
     } else if (char1.equals("T") 
       && (char2.equals("B") || char2.equals("A"))) { 
      return 1; 
     } else if (char1.equals("Q") 
       && (char2.equals("T") || char2.equals("B") || char2 
         .equals("A"))) { 
      return 1; 
     } else if (char1.equals("C") 
       && (char2.equals("Q") || char2.equals("T") 
         || char2.equals("B") || char2.equals("A"))) { 
      return 1; 
     } else if (char1.equals("D") 
       && (char2.equals("C") || char2.equals("Q") 
         || char2.equals("T") || char2.equals("B") || char2 
          .equals("A"))) { 
      return 1; 
     } else if (char1.equals("E") 
       && (char2.equals("D") || char2.equals("C") 
         || char2.equals("Q") || char2.equals("T") 
         || char2.equals("B") || char2.equals("A"))) { 
      return 1; 
     } else if (char1.equals("F") 
       && (char2.equals("E") || char2.equals("D") 
         || char2.equals("C") || char2.equals("Q") 
         || char2.equals("T") || char2.equals("B") || char2 
          .equals("A"))) { 
      return 1; 
     } 
+0

那豈不是更好地使用枚舉,而不是一個角色?據我所知,你只想比較單個字符,而不是字符串。 –

+2

創建查找表(char - > order)並將'lookup [char1]'與'lookup [char2]'進行比較。 – Phylogenesis

+0

一個解決方案是將字符放入列表並使用索引 –

回答

2

商店中(列表)你在數組的char []或列表中選擇所需的順序字符

比較基於字符的列表索引/陣列

list.indexOf(char1) - list.indexOf(char2);

+0

如果性能很重要,不要使用LinkedList。使用'ArrayList'或甚至更好''HashMap'。 –

+0

@FrankPuffer你爲什麼認爲''ArrayList'比'LinkedList'快要使用['indexOf()'](https://docs.oracle.com/javase/8/docs/api/)順序搜索列表爪哇/ UTIL/List.html#的indexOf-java.lang.Object-)? – Andreas

+0

@Andreas:因爲它很可能會更好地利用硬件內存緩存。 –

1

有一個很簡單的解決辦法:

首先把你的字符在名單:

char[] arrayChars= {'A','B','T', ... }; 
List<Character> sortedChars= new ArrayList<Character>(); 
for (char c : arrayChars) { // Arrays.asList won't work 
    sortedChars.add(c); 
} 

,然後比較指標:

int compare(char a,char b) { 
    return sortedChars.indexOf(a) - sortedChars.indexOf(b); 
} 
+0

謝謝!這看起來很容易 –

+0

indexOf在char []上不可用。我必須使用列表 –

+0

糟糕,你是對的,修正了 –

0

我會做這樣的

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Comparator; 
import java.util.List; 

public class Compare { 

    public static void main(String[] args) { 

     final List<Character> reference = new ArrayList<Character>(
       Arrays.asList(new Character[] {'A','B','T','Q','C','D','E','F'})); 

     Character[] toBeSorted = {'A','B','C','D','E','F','Q','T'}; 

     Comparator<Character> myComparator = new Comparator<Character>() { 

      public int compare(Character o1, Character o2) { 
       Integer i1 = reference.indexOf(o1); 
       Integer i2 = reference.indexOf(o2); 
       return i1.compareTo(i2); 
      } 

     }; 

     Arrays.sort(toBeSorted, myComparator); 

     System.out.println(Arrays.asList(toBeSorted)); 

    } 


} 
6

如果你想使用自定義的字符順序比較字符串,創建一個RuleBasedCollator,例如

String myRules = "< a, A < b, B < t, T < q, Q < c, C < d, D < e, E < f, F < g, G" + 
       "< h, H < i, I < j, J < k, K < l, L < m, M < n, N < o, O < p, P" + 
       "< r, R < s, S < u, U < v, V < w, W < x, X < y, Y < z, Z"; 
RuleBasedCollator myCollator = new RuleBasedCollator(myRules); 

String[] test = { "a", "B", "c", "D", "q", "T", "cc", "cB", "cq", "cT" }; 
Arrays.sort(test, myCollator); 
System.out.println(Arrays.toString(test)); 

輸出

[a, B, T, q, c, cB, cT, cq, cc, D] 
0

的整數(N)攜帶所謂的自然秩序。所以你只需將你的東西放在一個由整數索引的列表中,遵循你想要實現的順序。然後當比較2個字符的時候,你比較他們的索引,就是這樣!

0

最後,我用字符串,但它工作正常與:

public class IndiceRepetitionComparator implements Comparator<String> { 

    List<String> relationOrdre = Arrays.asList("A", "B", "T", "Q", "C", "D", "E", "F", "G", "H", "I", "J", "K", 
      "L", "M", "N", "O", "P", "R", "S", "U", "V", "W", "X", "Y", "Z"); 

    @Override 
    public int compare(String indiceRepetition1, String indiceRepetition2) { 

     // même objet 
     if (indiceRepetition1 == indiceRepetition2) { 
      return 0; 
     } 

     if (indiceRepetition1 == null) { 
      return -1; 
     } 

     if (indiceRepetition2 == null) { 
      return -1; 
     } 

     return (relationOrdre.indexOf(indiceRepetition1) - relationOrdre.indexOf(indiceRepetition2) > 0) ? 1 : -1; 
    } 
} 

謝謝您的幫助