首页 > 解决方案 > 生成查找表

问题描述

使用属性文件在 Java 中表示“查找”表的最佳方式是什么:

假设我有这个lookup.properties文件:(虽然我认为在这种情况下使用属性文件是非常错误的

(0,999)=/mnt/partition0/
(1000,1999)=/mnt/partition1/
(2000,2999)=/mnt/partition2/
(3000,3999)=/mnt/partition3/
(4000,4999)=/mnt/partition4/
(5000,5999)=/mnt/partition5/
(6000,6999)=/mnt/partition6/
(7000,7999)=/mnt/partition7/

还有一个方法

String id = "2001";
String partition = getPartitionPathById(id);
// returns /mnt/partition2/

标签: java

解决方案


这是一个解决方案:

public class PartitionImpl implements Partition {

  NavigableMap<Range, String> map;

  public PartitionImpl() {

  }

  @Override public String getPartition(Application application) {
    return getPartition(application.getAppId());
  }

  @Override public String getPartition(String appId) {
    if(map == null) {
      map = new TreeMap<Range, String>();
    }
    map.put(new Range(0, 999), "/mnt/partition0/");
    map.put(new Range(1000, 1999), "/mnt/partition1/");
    map.put(new Range(2000, 2999), "/mnt/partition2/");
    map.put(new Range(3000, 3999), "/mnt/partition3/");
    map.put(new Range(4000, 4999), "/mnt/partition4/");
    map.put(new Range(5000, 5999), "/mnt/partition4/");
    map.put(new Range(6000, 6999), "/mnt/partition6/");
    map.put(new Range(7000, 7999), "/mnt/partition7/");

    String idPart = appId.split("-")[1]; // return an integer value
    Integer id = Integer.valueOf(idPart);
    AtomicReference<String> thePartition = new AtomicReference<>();
    map.entrySet().forEach(rangeStringEntry -> {
      String partition = rangeStringEntry.getValue();
      Range range = rangeStringEntry.getKey();
      if(range.upper >= id && range.lower <= id) {
        thePartition.set(partition);
      }
    });
    return thePartition.get();
  }

}
public class Range implements Comparable<Range> {
  public int lower, upper;
  public int value;

  public Range(int lower, int upper) {
    this.lower = lower;
    this.upper = upper;
  }

  @Override public int compareTo(@NotNull Range range) {
    if (range.lower == this.lower && range.upper == this.upper) {
      return 0;
    }
    return -1;
  }
}

推荐阅读