2017-01-30 10 views
-1

これは正常に動作するため、この問題が完全に書き換えられています。Javaのstring.matches()メソッドで同じ値を2回一致させないようにしてください。

は、私は次の二つの数字(shouldPassTestとshouldFailTest)同じ数字であれば、異なる10Sの場所で知りたい567

の値と数、testNumberがあるとします。あなたは、各桁が使用可能な数字の範囲からテストされていることであることを実行したときに何が起こる

int testNumber = 567; 
int num1 = 5; 
int num2 = 6; 
int num3 = 7; 

int shouldPassTest = 756; 
int shouldFailTest = 777; 


if(Integer.toString(shouldPassTest).matches("[5,6,7][5,6,7][5,6,7]") 
{ 
    //Do some cool stuff 
} 

if(Integer.toString(shouldFailTest).matches("[5,6,7][5,6,7][5,6,7]") 
    { 
     //Do some cool stuff 
    } 

(5、6、および7):

は、だからここのコードです。理論的には、shouldFailTest は、実際にテストに合格する必要があります。 3回ではあるが、どのように7が3つの基準の1つに一致するかを見てください。

しかし、何が起こるかは、テスト時に777がfalseを返すことです。これはまさに私のコードで欲しかった結果ですが、なぜそれが起こったのかを知りたいのですが、です。マッチメソッドテストは、各番号が1回だけ一致することを確認しますか?

ありがとうございます!

この投稿は高度に編集されています。私のコードを実行した後、私はこのメソッドが私が欲しいものを正確に実行していることを発見しましたが、今はその理由を知りたいのです。ありがとう。

+0

あなたは1つの番号が別のアナグラムであるかどうかを確認するために探しているように聞こえます。 – azurefrog

+0

"異なる解決策"。 'Integer.toString'を使用した後、文字列を文字に分解し、配列を使用して文字を保持します。その後、配列から要素を削除することができます。 'Set'を使う方が良いでしょうが、あなたの数字が同じ数字の複数を持つことができればうまくいきません。しかし、正規表現でこれを解決しようとしないでください。 – ajb

+0

はい、奇妙なことに、コードはまさに私が望むものです。 777はfalseを返します。今私は楽しく驚いて混乱しています。 –

答えて

1

正規表現は、この問題に良い解決策ではないように私には、以下を使用します。

public class Count { 
    private int value; 
    public Count() { 
     value=0; 
    } 
    void increment() { 
     value++; 
    } 
    void decrement() { 
     value--; 
    } 

    public int getValue() { 
     return value; 
    } 
} 
public static boolean isAnagram(int val1, int val2) { 
    Map<Character, Count> characterCountMap=new HashMap<>(); 
    for(char c:Integer.toString(val1).toCharArray()) { 
     Count count=characterCountMap.get(c); 
     if(count==null) { count=new Count(); characterCountMap.put(c, count);} 
     count.increment(); 
    } 
    for(char c:Integer.toString(val2).toCharArray()) { 
     Count count=characterCountMap.get(c); 
     if(count==null) { return false; } 
     else { count.decrement(); } 
     if(count.getValue()==0) { 
      characterCountMap.remove(c); 
     } 
    } 
    return characterCountMap.size()==0; 
} 

実行してください:

System.out.println(Integer.toString(shouldFailTest).matches("[5,6,7][5,6,7][5,6,7]")); 

を実際の戻り値を表示します。

0

理論的には、shouldFailTestは実際には3回とはいえ、 どのように7試合、私の三つの基準の一つとして見て試験に合格しなければなりません。

しかし、何が起こるかは、テスト時に777がfalseを返すことです。これは です。私のコードで欲しかった結果ですが、なぜ が起こったのか知りたいのですが。一致方法テストでは、各番号 が1回だけ一致することを確認しますか?

ありませんが、 "777" は、あなたのコード内で指定したパターン "[5,6,7]、[5,6,7]、[5,6,7]"

次の条件に一致しません真と評価されます。

if(Integer.toString(shouldFailTest).matches("[5,6,7][5,6,7][5,6,7]"))

関連する問題