0

我正在寻找一种比较两个“列表”的更好方法。这个想法是:我有 2 个由字符串组成的列表。如果两个列表中的所有字符串都匹配,我的方法将返回 true。IE

列表(1)=“foo,foo1,foo2,foo3”

列表(2)=“foo,foo1,foo2,foo3”

在比较这两个列表时,如果所有字符串都匹配,则该方法返回 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);
}

上下文规则

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

3 回答 3

1

我认为通过一些重构和应用 DRY,您的方法将与其他任何方法一样有效:

移动Context类内部的匹配逻辑:

@Override
public boolean match(Context anotherContext) {
    return match(this.getUser(), anotherContext.getUser()) &&
            match(this.getApplication(), anotherContext.getApplication()) &&
            match(this.getService(), anotherContext.getService()) &&
            match(this.getOperation(), anotherContext.getOperation());
}

private boolean match(String thisString, String thatString) {
    return thisString.equals(WILDCARD) || thisString.equals(thatString);
}

然后使用它:

private boolean match(Context messageContext, ContextRule contextRule) {
    Context ruleContext = contextRule.getContext();
    return ruleContext.match(messageContext);
}
于 2013-11-08T01:28:35.223 回答
0

列表实现覆盖了 equals 方法。

有没有要求不使用这个?

list1.equals(list2);

文档:

比较指定对象与此列表是否相等。当且仅当指定对象也是一个列表时返回 true,两个列表具有相同的大小,并且两个列表中所有对应的元素对都相等。(如果 (e1==null ? e2==null : e1.equals(e2)) 两个元素 e1 和 e2 相等。)换句话说,如果两个列表以相同的顺序包含相同的元素,则它们被定义为相等. 此定义确保 equals 方法在 List 接口的不同实现中正常工作

这会执行上面的前两个操作,并将每个元素调用 .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;
}

可以想出许多变体,但我认为很难利用 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 回答