当前位置: 首页 > 面试题库 >

有没有一种方法来获取Java属性文件中的某些已筛选的键的列表?

孙钱青
2023-03-14
问题内容

假设您有以下属性文件“列表”:

this.is.a.key.1 = lk1mldk3ml2k3e2l3k
this.is.a.key.2 = 2309420398402931
this.is.a.key.3 = lksl1k2ml1kmd

所以…

有没有一种方法可以从属性文件中“提取”所有这些this.is.a.key。*键,而不必一个个地对其进行硬编码?

我问这个的原因是因为我不想要这个:

this.is.a.list.key = 12983798123,82193819mx91,23891293819283,3892938492834

因为我需要键名称中的那些“ 1,2,3 …”名称来区分一个键和另一个键。

有什么办法吗?还是我必须对其进行硬编码?


问题答案:

我写了MapFilter类来为我做这件事:

/*
 * Note that all access through the filter reference the underlying Map so
 * adding to a MapFilder results in additions to the Map.
 */
public class MapFilter<T> implements Map<String, T> {
  // The enclosed map -- could also be a MapFilter.
  final private Map<String, T> map;
  // Use a TreeMap for predictable iteration order.
  // Store Map.Entry to reflect changes down into the underlying map.
  // The Key is the shortened string. The entry.key is the full string.
  final private Map<String, Map.Entry<String, T>> entries = new TreeMap<String, Map.Entry<String, T>>();
  // The prefix they are looking for in this map.
  final private String prefix;

  public MapFilter(Map<String, T> map, String prefix) {
    // Store my backing map.
    this.map = map;
    // Record my prefix.
    this.prefix = prefix;
    // Build my entries.
    rebuildEntries();
  }

  public MapFilter(Map<String, T> map) {
    this(map, "");
  }

  private synchronized void rebuildEntries() {
    // Start empty.
    entries.clear();
    // Build my entry set.
    for (Map.Entry<String, T> e : map.entrySet()) {
      String key = e.getKey();
      // Retain each one that starts with the specified prefix.
      if (key.startsWith(prefix)) {
        // Key it on the remainder.
        String k = key.substring(prefix.length());
        // Entries k always contains the LAST occurrence if there are multiples.
        entries.put(k, e);
      }
    }

  }

  @Override
  public String toString() {
    StringBuilder s = new StringBuilder("MapFilter (" + prefix + ") of " + map + " containing ").append(entrySet());
    return s.toString();
  }

  // Constructor from a properties file.
  public MapFilter(Properties p, String prefix) {
    // Properties extends HashTable<Object,Object> so it implements Map.
    // I need Map<String,T> so I wrap it in a HashMap for simplicity.
    this(new HashMap<String, T>((Map) p), prefix);
  }

  // Helper to fast filter the map.
  public MapFilter<T> filter(String prefix) {
    // Wrap me in a new filter.
    return new MapFilter<T>(this, prefix);
  }

  // Count my entries.
  public int size() {
    return entries.size();
  }

  // Are we empty.
  public boolean isEmpty() {
    return entries.isEmpty();
  }

  // Is this key in me?
  public boolean containsKey(Object key) {
    return entries.containsKey(key);
  }

  // Is this value in me.
  public boolean containsValue(Object value) {
    // Walk the values.
    for (Map.Entry<String, T> e : entries.values()) {
      if (value.equals(e.getValue())) {
        // Its there!
        return true;
      }
    }
    return false;
  }

  // Get the referenced value - if present.
  public T get(Object key) {
    return get(key, null);
  }

  // Get the referenced value - if present.
  public T get(Object key, T dflt) {
    Map.Entry<String, T> e = entries.get((String)key);
    return e != null ? e.getValue() : dflt;
  }

  // Add to the underlying map.
  public T put(String key, T value) {
    T old = null;
    // Do I have an entry for it already?
    Map.Entry<String, T> entry = entries.get(key);
    // Was it already there?
    if (entry != null) {
      // Yes. Just update it.
      old = entry.setValue(value);
    } else {
      // Add it to the map.
      map.put(prefix + key, value);
      // Rebuild.
      rebuildEntries();
    }
    return old;
  }

  // Get rid of that one.
  public T remove(Object key) {
    // Do I have an entry for it?
    Map.Entry<String, T> entry = entries.get((String)key);
    if (entry != null) {
      entries.remove(key);
      // Change the underlying map.
      return map.remove(prefix + key);
    }
    return null;
  }

  // Add all of them.
  public void putAll(Map<? extends String, ? extends T> m) {
    for (Map.Entry<? extends String, ? extends T> e : m.entrySet()) {
      put(e.getKey(), e.getValue());
    }
  }

  // Clear everything out.
  public void clear() {
    // Just remove mine. This does not clear the underlying map.
    for (String key : entries.keySet()) {
      map.remove(prefix + key);
    }
    entries.clear();
  }

  public Set<String> keySet() {
    return entries.keySet();
  }

  public Collection<T> values() {
    // Roll them all out into a new ArrayList.
    List<T> values = new ArrayList<T>();
    for (Map.Entry<String, T> v : entries.values()) {
      values.add(v.getValue());
    }
    return values;
  }

  public Set<Map.Entry<String, T>> entrySet() {
    // Roll them all out into a new TreeSet.
    Set<Map.Entry<String, T>> entrySet = new TreeSet<Map.Entry<String, T>>();
    for (Map.Entry<String, Map.Entry<String, T>> v : entries.entrySet()) {
      entrySet.add(new Entry<T>(v));
    }
    return entrySet;
  }

  /**
   * An entry.
   *
   * @param <T>
   *
   * The type of the value.
   */
  private static class Entry<T> implements Map.Entry<String, T>, Comparable<Entry<T>> {
    // Note that entry in the entry is an entry in the underlying map.
    private final Map.Entry<String, Map.Entry<String, T>> entry;

    Entry(Map.Entry<String, Map.Entry<String, T>> entry) {
      this.entry = entry;
    }

    public String getKey() {
      return entry.getKey();
    }

    public T getValue() {
      // Remember that the value is the entry in the underlying map.
      return entry.getValue().getValue();
    }

    public T setValue(T newValue) {
      // Remember that the value is the entry in the underlying map.
      return entry.getValue().setValue(newValue);
    }

    @Override
    public boolean equals(Object o) {
      if (!(o instanceof Entry)) {
        return false;
      }
      Entry e = (Entry) o;
      return getKey().equals(e.getKey()) && getValue().equals(e.getValue());
    }

    @Override
    public int hashCode() {
      return getKey().hashCode() ^ getValue().hashCode();
    }

    @Override
    public String toString() {
      return getKey() + "=" + getValue();
    }

    public int compareTo(Entry<T> o) {
      return getKey().compareTo(o.getKey());
    }
  }

  // Simple tests.
  public static void main(String[] args) {
    String[] samples = {
      "Some.String.For.Me",
      "Some.String.For.You",
      "Some.More",
      "Yet.More"};
    Map map = new HashMap();
    for ( String s : samples ) {
      map.put(s, s);
    }
    Map all = new MapFilter(map);
    Map some = new MapFilter(map, "Some.");
    Map someString = new MapFilter(some, "String.");
    System.out.println("All: "+all);
    System.out.println("Some: "+some);
    System.out.println("Some.String: "+someString);
  }


}


 类似资料:
  • 问题内容: 我有这个API: 但是in始终返回null。我可以将@GET更改为@POST,并且可以使用,但是我并没有真正执行创建或更新操作,因此使用post似乎很奇怪。 有没有办法通过球衣的GET请求获得身体? 问题答案: TL; DR 正确的解决方案是使用POST。 “我可以将@GET更改为@POST,并且可以,但是我并没有真正执行创建或更新操作,因此使用post似乎很奇怪” 为什么这么奇怪?P

  • 在以下Spring Boot应用程序中,@Value注释在WebSecurityConfig类中成功,但在FileSystemUplad类中没有。在FileSystemUplad类中,值(测试)使用与WebSecurityConfig使用的相同属性文件导致null。 应用.java WebSecurityConfig.java(其中@Value注入工作正常) FileSystemUpload.ja

  • 问题内容: 是否有一个很好的方法来Map 获取和忽略案件? 问题答案: TreeMap扩展了Map并支持自定义比较器。 字符串提供默认的不区分大小写的比较器。 所以: 比较器不考虑区域设置。在其JavaDoc中阅读有关它的更多信息。

  • 我花了很长时间研究这个问题。但我还是没有找到解决办法。请帮我解决这个问题。我有一个JSP文件,并在应用程序中使用struts。当我尝试在浏览器中加载页面时,它会抛出此错误。 一切都很好。也没有区分大小写的问题。但是这个代码不起作用。请帮我解决这个问题。 JSP: 还有我的班级档案

  • 问题内容: 我正在编写小型且非常干燥的框架,该框架高度依赖元数据。我想知道是否有一种方法来获取方法参数名称,即给定一些方法 得到的字符串和。 我知道我可以注释参数,但是那不是很好。 问题答案: 我们为包含参数名称的String[]的方法创建了一个自定义注释。与必须注释每个单独的参数相比,此方法感觉易于管理。我们计划添加构建时检查,以确保带注释的参数名称的数量与参数的数量匹配,因为这是我们所需要的。

  • 问题内容: 我有如下对象的数组。 如何获得属性设置为的计数项目? 更新: 问题是从REST api获取的,只是循环$ scope.students变量不起作用,因为直到请求完成,该变量才起作用,因此循环代码错误地指出。 我尝试使用,但是在那种情况下,我必须在watch指令下定义循环,并且仅在定义$ scope.students时才工作一次,此后循环就无法正常工作,因为$ scope.student