2017-09-22 1 views
0

私は自分のキーであるストリングを持っており、そのキーの各文字にアルファベット順を表す数字を割り当てる方法があります。例えば、私のキーは、単語「セキュリティ」の場合、出力は4, 1, 0, 6, 3, 2, 5, 7で、次のように私のコードは次のとおりです。私はここに、配列をプリントアウト省略しました重複する文字とそのアルファベット順のキー

String key = "Security".toLowerCase(); 
String alphabet = Arrays.stream(key.split("")).sorted().collect(Collectors.joining()); 
int[] order = new int[key.length()]; 
for (int i = 0; i < key.length(); i++) { 
    order[i] = alphabet.indexOf(key.charAt(i)); 
} 

...

このコードをキーに重複する文字が含まれていない場合は正常に動作します。しかし、例えばキーが "aardvark"になると、出力は問題になる0, 0, 5, 3, 7, 0, 5, 4になります。私はこの問題を回避する方法を知らない。希望する出力は0, 1, 5, 3, 7, 2, 6, 4でなければなりません。

提案がありますか?私はJavaプログラミングには新しいので、非常に複雑なソリューションを理解できないかもしれません。

+0

ようこそを生成します!良い質問をするので、良い答えを得るためにあなたを助けるために私たちの[SO質問チェックリスト](http://meta.stackoverflow.com/questions/260648/stack-overflow-question-checklist)を確認してください。 –

+0

私は@JoeCを持っていると思った。私が含まなかったのは、この問題を解決しようとした私の試みだけだったと思います。私は 'order'を複製し、' for'ループを使用して重複があるかどうかを調べ、もしあれば元の配列を1つ増やしました。しかし、私はまだすべての手紙のためのユニークなカウントを取得していないので、それは動作しませんでした。 –

+1

期待される出力が「0,1,5,3,7,2,5,4」である理由を説明してください。私の理解では、「aardvark」の最初の「a」は「0」にマップされます。二番目のこともそうです。 2番目のマッピングを「インクリメント」する理由を説明してください。 – blafasel

答えて

1

一つの方法:

モデル独自のクラスで「アルファベット」に匹敵主です:ここで

String key = "aardvark".toLowerCase(); 
String alphabet = Arrays.stream(key.split("")).sorted().collect(Collectors.joining()); 
System.out.println("alphabet: " + alphabet); 
int[] order = new int[key.length()]; 
for (int i = 0; i < key.length(); i++) { 
    order[i] = alphabet.indexOf(key.charAt(i)); 
    alphabet = alphabet.replaceFirst(""+key.charAt(i), "0"); //Zero out chars as they are used 
    System.out.println(order[i]); 
} 
+0

は、文字列にゼロが含まれていると失敗します。 –

+0

真ですが、これは単なる例です。文字列にないことがわかっている任意の文字を使用できます。 – jwils

+0

[OK]。しかし、あなたのコードには、文字を出力する必要があります(たとえば、 –

1

これをトリックで達成できます。あなたはマルチソートをしなければなりません。これをJavaで実現するには、マップの1つのエントリ内に両方の配列の各エントリを保存します。このマップをキーでソートすることができ、値もソートされます。それはトリックです。

String key = "Security".toLowerCase(); 
ArrayList<Integer> order = new ArrayList<>(); 
String[] alphabet = key.split("")); 
SortedMap<String,Integer> map = new TreeMap<>(); 
for (int i = 0; i < key.length(); i++) { 
    map.put(alphabet[i], i); 
} 
SortedMap<Integer, Integer> map2 = new TreeMap<>(); 
int i = 0; 
for (Entry<Integer, Integer> entry : map.entrySet()) { 
    map2.put(entry.getValue(), i++); 
} 
for (Entry<Integer, Integer> entry : map2.entrySet()) { 
    order.add(entry.getValue()); 
} 

このようなものは、マップがキーから一つ一つの文字で満たされ、値が元のキー文字列中の位置であるテストされていない

を動作するはずです。ソートされたマップなので、マップはキーでソートされます。したがって、ord-noの昇順です。文字から位置も同じ瞬間にソートされます。今度は2番目のマップを作成し、ソートされた位置とこの位置のインデックスを現時点で入力します。これはソートされたマップなので、位置は順序付けられ、インデックス(マップエントリの値)はアルファベットのキーです。この位置はループで読み出され、順序配列内に保存されます。彼らが使用されている文字から「ゼロ」を行うことになる

0

は、オブジェクト指向のソリューションですそれが表す文字の英数字の値と、それが「キー」の文字列の中にある位置によって二次的に求められます。アルファベット(equals()に実装されている)の識別は、「キー」文字列内の位置によって決まります。

public class Alphabet implements Comparable<Alphabet> { 

    private final char character; 
    private final int position;  

    public Alphabet(char character, int position) { 
     this.character = character; 
     this.position = position; 
    } 

    @Override 
    public boolean equals(Object other) { 
     if (other instanceof Alphabet) { 
      return other != null && position == ((Alphabet) other).position; 
     } 
     return false; 
    } 

    @Override 
    public int hashCode() { 
     return Objects.hash(position); 
    } 

    @Override 
    public int compareTo(Alphabet other) { 

     int comparison = Character.compare(character, other.character); 

     if (comparison != 0) { 
      return comparison; 
     } else { 
      return Integer.compare(position, other.position); 
     } 
    } 
} 

さて、変換アルゴリズムを実装するために簡単になり:

  1. は、リストのコピーを作成し、それがで指定された順序に基づいて並べ替える入力/キー文字列
  2. からList<Alphabet>を作成します。 Alphabet
  3. 元のアルファベットリストと各要素について、アルファベットがソートされたリストのインデックスを参照して「順序配列」を作成します。

は、次のように:

public static int[] ordering(String input) { 

    List<Alphabet> alphabet = new ArrayList<>(); 

    for (int i = 0; i < input.length(); i++) { 
     alphabet.add(new Alphabet(input.charAt(i), i)); 
    } 

    List<Alphabet> sorted = new ArrayList<>(alphabet); 
    Collections.sort(sorted); 
    int[] ordering = new int[input.length()]; 

    for (int i = 0; i < input.length(); i++) { 
     ordering[i] = sorted.indexOf(alphabet.get(i)); 
    } 
    return ordering; 
} 

テストラン

String input1 = "security", input2 = "aardvark"; 

System.out.println(input1 + ": " + Arrays.toString(ordering(input1))); 
System.out.println(input2 + ": " + Arrays.toString(ordering(input2))); 

でスタックオーバーフローに

 
security: [4, 1, 0, 6, 3, 2, 5, 7] 
aardvark: [0, 1, 5, 3, 7, 2, 6, 4] 
関連する問題