0

2 つの「リスト」を比較するより良い方法を探しています。アイデアは次のとおりです。文字列で構成される2つのリストがあります。両方のリストのすべての文字列が一致する場合、私のメソッドは true を返します。IE

List(1) = "foo、foo1、foo2、foo3"

List(2) = "foo、foo1、foo2、foo3"

これら 2 つのリストを比較して、すべての文字列が一致する場合、メソッドは true を返します。いずれかの要素が一致しない場合は、false を返します。

私が持っている(そして動作する)コードはこれです:しかし、誰かがこの問題に対するより良い解決策を考えられるかどうか疑問に思っていましたか?

private boolean match(Context messageContext, ContextRule contextRule) {
if(contextRule.getMessageContext().getUser().equals(ContextRuleEvaluator.WILDCARD)
    || (contextRule.getMessageContext().getUser().equals(messageContext.getUser()))) {
  if(contextRule.getMessageContext().getApplication().equals(ContextRuleEvaluator.WILDCARD)
      || (contextRule.getMessageContext().getApplication().equals(messageContext.getApplication()))) {
    if(contextRule.getMessageContext().getService().equals(ContextRuleEvaluator.WILDCARD)
        || (contextRule.getMessageContext().getService().equals(messageContext.getService()))) {
      if(contextRule.getMessageContext().getOperation().equals(ContextRuleEvaluator.WILDCARD)
          || (contextRule.getMessageContext().getOperation().equals(messageContext.getOperation()))) {
        return true;
      }
    }
  }
}

return false;

}

環境

public interface Context {    
  public String getUser();      
  public void setUser(String user);      
  public String getApplication();      
  public void setApplication(String application);      
  public String getService();      
  public void setService(String service);      
  public String getOperation();      
  public void setOperation(String operation);
}

ContextRule

public interface ContextRule {
  public Context getMessageContext();      
  public int getAllowedConcurrentRequests();      
}
4

3 に答える 3

0

リストの実装は equals メソッドをオーバーライドします。

これを使用しないという要件はありますか?

list1.equals(list2);

javadoc:

指定されたオブジェクトがこのリストと等しいかどうかを比較します。指定されたオブジェクトもリストであり、両方のリストが同じサイズであり、2 つのリスト内の対応する要素のすべてのペアが等しい場合にのみ、true を返します。(2 つの要素 e1 と e2 は、(e1==null ? e2==null : e1.equals(e2)) の場合に等しいです。) つまり、2 つのリストは、同じ要素が同じ順序で含まれている場合に等しいと定義されます。 . この定義により、List インターフェースのさまざまな実装で equals メソッドが適切に機能することが保証されます。

これは、上記の最初の 2 つの操作を実行し、各要素の .equals(...) メソッドを他の要素に呼び出します。そのため、要素で equals メソッドを適切にオーバーライドしたことを確認してください。

于 2013-11-07T23:49:02.593 に答える
0

あなたができること(ただし、不要なオブジェクトの作成が追加されます):

private static boolean match(Context messageContext, ContextRule contextRule) {
  Context ruleContext = contextRule.getMessageContext();
  String[] interleaved = {
      ruleContext.getUser(), messageContext.getUser(), 
      ruleContext.getApplication(), messageContext.getApplication(),
      ruleContext.getService(), messageContext.getApplication(),
      ruleContext.getOperation(), messageContext.getOperation()};
  for (int i = 0; i < interleaved.length; i += 2) {
    if (!interleaved[i].equals(ContextRuleEvaluator.WILDCARD) && 
        !interleaved[i].equals(interleaved[i + 1]) {
      return false;
    }
  }
  return true;
}

これの多くの変形を考え出すことは可能ですが、WILDCARD を考慮する必要があるため、list.equals() を利用するのは難しいと思います...

冗長性を減らすためにヘルパーを利用して、元のチェックをより簡潔な形式で書き直します。

private static boolean matchValue(String ruleValue, String messageValue) {
  return ruleValue.equals(ContextRuleEvaluator.WILDCARD) 
      || ruleValue.equals(messageValue);
}

private static boolean match(Context messageContext, ContextRule contextRule) {
  Context ruleContext = contextRule.getMessageContext();
  return matchValue(ruleContext.getUser(), messageContext.getUser())
      && matchValue(ruleContext.getApplication(), messageContext.getApplication())
      && matchValue(ruleContext.getService(), messageContext.getService())
      && matchValue(ruleContext.getOperation(), messageContext.getOperation());
  }
}
于 2013-11-08T01:04:01.103 に答える