2016-04-17 30 views
0

の文字のリストに従って単語のリストを並べ替え:は、私が持っているJavaの

List<String> alphabet; (contains 26 unique characters as elements, for example 
qwertyuiosapdfghjklzcxvbnm) 

List<String> wordsToArrange; contains words as elements, for example: 

- apple 
- stream 
- posthouse 
- sea 
- seed 

私は私が作ったアルファベットに応じた単語を配置する必要があります。

私のアプローチは現時点ではサイクルのためのものです。

alphabet(i) compare it with all the words charAt(0) 
if only 1 is found i put it to a new list arrangedList 

but if 2 is found i go alphabet(i+1) till the letter is found and now i can put them in a right order to arrangedList.... 

then move back to alphabet(i+1) till alphabet(26) and now all should be arranged correctly... 

私は、このコードのためのいくつかの基本を書いてきたが、私は「cyclyingのための」深刻なを開始する前に、他のアプローチがどうなるかお聞きしたかったのです。

ありがとうございます!

フォローアップ Changing specific characters in List of Strings in Java

答えて

0

私はなります

  1. はあなたのアルファベットの「逆」にソートするためにあなたの言葉でそれぞれの文字をマップします。例えば:
    • 'a'その列の11番目の文字であるため、'k'
    • 'b'にマップされた列の24番目の文字であるため、'x'
    • にマップ
  2. リストを並べ替えるCollections.sort
  3. ソートされた単語の各文字を元の文字に戻します。 'k' -> 'a'; 'x' -> 'b'
+0

私が正しく、それを理解していればそれだけで「qwertyuiosapdfghjklzcxvbnm」のために働くだろうが、私はすべての組み合わせの編集のために働くためにそれを必要があります。しかし、私は今、それについてより深く考えるならば、これは、インデックスとして使用するアルファベットとあれば動作します文字「 – JavaJuniorSoon2bSenior

+0

」にマップします。 –

+0

ありがとうございます!申し訳ありませんが、英語は私の第二の憧れです。 :) – JavaJuniorSoon2bSenior

0

Java 8のフィルタとストリームを使用して、特定の文字で始まるものをフィルタリングします。次に、結果を並べ替えます。単一の配列にする必要がある場合は、結果を結合します。

import java.util.Arrays; 
/** 
* Created by Brandon on 2016-04-17. 
*/ 
public class Main { 
    public static void main(String[] args) { 

     String[] array = new String[]{"apple", "stream", "posthouse", "sea", "seed"}; 
     //char[] indices = new char[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'}; 
     char[] indices2 = new char[]{'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'z', 'x', 'c', 'v', 'b', 'n', 'm'}; 

     for (char key : indices2) { 
      String[] result = Arrays.stream(array).filter(value -> value.charAt(0) == key).toArray(length -> new String[length]); 

      if (result.length > 0) { 
       Arrays.sort(result); 
       System.out.println(Arrays.toString(result)); 
      } 
     } 
    } 
} 

indicesを使用している場合、結果は次のとおりです。

[apple] 
[posthouse] 
[sea, seed, stream] 

indices2を使用している場合、結果は次のとおりです。その実装する新しいクラスで文字列をラッピングについて

[posthouse] 
[apple] 
[sea, seed, stream] 
+0

これは面白い、ありがとう! – JavaJuniorSoon2bSenior

0

何匹敵します?

テストしていないエッジケースのバグがあるかもしれません。

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 

public class CompString { 

    public static void main(String[] args) { 
     List<ComparableString> list = new ArrayList<ComparableString>(); 

     list.add(new ComparableString("apple")); 
     list.add(new ComparableString("stream")); 
     list.add(new ComparableString("posthouse")); 
     list.add(new ComparableString("sea")); 
     list.add(new ComparableString("seed")); 

     Collections.sort(list); 

     System.out.println(list); 
    } 

} 

class ComparableString implements Comparable<ComparableString> { 

    String str; 
    static String sortOrder = "qwertyuiosapdfghjklzcxvbnm"; 

    public ComparableString(String string) { 
     str = string; 
    } 

    @Override 
    public String toString() { 
     return str; 
    } 

    @Override 
    public int compareTo(ComparableString other) { 
     for (int i = 0; i < Math.min(this.str.length(), other.str.length()); i++) { 
      int thisOrder = ComparableString.sortOrder.indexOf(this.str.charAt(i)); 
      int thatOrder = ComparableString.sortOrder.indexOf(other.str.charAt(i)); 

      int order = thisOrder - thatOrder; 
      if (order != 0) { 
       return order; 
      } 

     } 

     if (this.str.length() > other.str.length()) { 
      return -1; 
     } else if (this.str.length() < other.str.length()) { 
      return 1; 
     } 
     return 0; 
    } 
} 
関連する問題