1

データベースから取得したすべてのグループを含む HashSet があります。2 つの特定のグループを削除して、この結果をフィルタリングするように依頼されました。些細なことのように思えますが、フィルターで除外したい特定のグループを保存するための確実な解決策が思いつかないようです。

私の考えは、除外する必要がある 2 つのグループへの参照を含む配列を作成することです。次に、配列内にあるものを使用して検索クエリを除外できます。私の懸念は、将来、より多くのグループを除外するように求められる可能性があり、配列が良い考えではない可能性があることです。

//Creates the array containing groups to filter out

String[] hiddenGroups = {"group1","group2"};
//retrieves all groups
Set<String>allGroups = new HashSet<String>();
allGroups.addAll(authorityService.getAllAuthorities(AuthorityType.GROUP);
List<String>results = new ArrayList<String>();

//filters out specified groups 
for (String group : allGroups) {
  boolean isHidden = false;
  for (String hiddenGroup : hiddenGroups) {
    if (hiddenGroup.equalsIgnorecase(group)) {
      isHidden = true;
    }
  }
  if (!isHidden){
    results.add(group);
  }
}
4

1 に答える 1

1

HashSet 内の要素の検索は、一定の時間で実行できます。そのため、HashSet 内の要素をループするのではなく、代わりに完全なセットから作業し、文字列が完全なセット内に含まれていることがわかったときに文字列を削除することで、コードをより効率的にすることができます。

//Creates the array containing groups to filter out

String[] hiddenGroups = {"group1","group2"};

//retrieves all groups
Set<String>allGroups = new HashSet<String>();
allGroups.addAll(authorityService.getAllAuthorities(AuthorityType.GROUP);
Set<String>results = allGroups.clone();

//filters out specified groups 
for (String group : hiddenGroups) {
  if (allGroups.contains(group)) {
    results.remove(group);
  }
}

グループ数が多い場合でも一定時間で検索されるため高速です。

于 2010-03-31T02:16:53.727 に答える