private int[][][] maps=new int[23][11][11]; public ReadMap() { int index = 0; BufferedReader br = null; for(int i=1;i<=22;i++) { try { BufferedReader in = new BufferedReader(new FileReader("maps/"+i+".map")); String line; //一行数据 int row=0; //逐行读取,并将每个数组放入到数组中 while((line = in.readLine()) != null) { String[] temp = line.split("\\s+"); for(int j=0;j<temp.length;j++) { maps[i][row][j]=Integer.parseInt(temp[j]); } row++; } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public int[][][] getMaps() { return maps; } }
时间: 2024-02-14 20:14:26 浏览: 85
这是一个 Java 类,名为 ReadMap,它用于读取一系列地图文件,将它们转换为三维数组并保存到成员变量 maps 中。其中,maps 是一个三维 int 数组,大小为 [23][11][11],表示一共有 23 个地图,每个地图有 11 行和 11 列。ReadMap 类有一个公共方法 getMaps,用于获取 maps 数组。该方法没有参数,返回一个三维 int 数组。在 ReadMap 类的构造函数中,它使用 BufferedReader 和 FileReader 读取每个地图文件,将每一行数据转换为 int 数组,并放入 maps 数组的对应位置中。如果读取文件时出现异常,它会在控制台上打印出堆栈跟踪信息。
相关问题
public void test1(){ // .net 是原始容量 * 2 开始找下一个质数作为新容量 System.out.println(hashtableGrowRule(10)); int[] array = lowSameArray(1000); System.out.println(Arrays.toString(array)); int[] sizes = {11, 16, 23}; printHashResult(array, sizes); } public static void printHashResult(int[] array, int[] sizes) { List<Map<Integer, AtomicInteger>> maps = new ArrayList<>(); for (int size : sizes) { maps.add(getMap(size)); } for (int hash : array) { for (int j = 0; j < sizes.length; j++) { maps.get(j).get(hash % sizes[j]).incrementAndGet(); } } for (Map<Integer, AtomicInteger> map : maps) { System.out.printf("size:[%d] %s%n", map.size(), map); } } private static HashMap<Integer, AtomicInteger> getMap(int size) { HashMap<Integer, AtomicInteger> result = new HashMap<>(); for (int i = 0; i < size; i++) { result.put(i, new AtomicInteger()); } return result; } private static List<Integer> hashtableGrowRule(int n) { List<Integer> list = new ArrayList<>(); int init = 0; list.add(init); if (n >= 1) { init = 11; list.add(init); } for (int i = 1; i < n; i++) { init = (init << 1) + 1; list.add(init); } return list; } public static int[] lowSameArray(int n) { int[] array = new int[n]; Random r = new Random(); for (int i = 0; i < n; i++) { array[i] = r.nextInt() & 0x7FFF0002; } return array; }
这段代码是一个测试方法 `test1`,其中包含了一些与哈希表相关的操作。下面我会逐行解释这段代码的功能和逻辑:
1. `hashtableGrowRule` 方法根据传入的参数 n,生成一个列表,列表中的元素是根据原始容量不断乘以 2 并找到下一个质数作为新容量的结果。例如,当 n = 10 时,生成的结果列表为 [0, 11, 23, 47, 95, 191, 383, 767, 1535, 3071, 6143]。
2. `lowSameArray` 方法生成一个长度为 n 的整型数组,数组中的元素是通过随机数生成,并进行位运算操作得到的结果。这个操作会保证生成的随机数具有一定的重复性。
3. `printHashResult` 方法接受一个整型数组 array 和一个整型数组 sizes 作为参数。它会创建一个列表 maps,其中的元素是一个 HashMap<Integer, AtomicInteger> 对象。根据 sizes 中的每个元素,通过调用 `getMap` 方法创建对应大小的 HashMap,并将其添加到 maps 列表中。
4. 接下来的两个嵌套循环用于遍历 array 数组和 maps 列表,并对哈希表进行操作。对于每个哈希表,根据当前元素的哈希值取模得到一个索引,然后通过 `incrementAndGet` 方法对索引位置上的 AtomicInteger 进行原子递增操作。
5. 最后,使用增强的 for 循环遍历 maps 列表,打印出每个哈希表的大小和内容。
总体来说,这段代码的目的是测试不同大小的哈希表在处理具有一定重复性的随机数时的效果。通过输出每个哈希表的大小和内容,可以观察到不同大小哈希表的分布情况和冲突情况。
在 LightWAN 系统中,DomainSet 是一组域名的集合,单个 DomainSet 包含几千至数十万不等的域名。LightWAN 按 DomainSet 编排用户的 SaaS 访问流量,当用户访问的目标域名包含在某个 DomainSet 中时,其请求流量会按对应的策略转发,因此需要高效地判断一个 DomainSet 中是否包含指定域名。请设计 DomainSet 的数据结构,并实现构造方法和 contains 方法(注意域名的层级结构,例如 google.com 根域名包含了maps.google.com 子域名) public class DomainSet f public DomainSet(Set<String> domains) I/ TODO public boolean contains(String domain) (II TODO
为了高效地判断一个 DomainSet 中是否包含指定域名,我们可以使用 Trie 树(字典树)来实现。Trie 树是一种树形结构,用于存储字符串,每个节点代表一个字符,从根节点到叶子节点的路径表示一个字符串。在 DomainSet 中,树的每个节点代表一个域名的一级域名(例如 ".com")或二级域名(例如 ".google.com")。在 contains 方法中,我们可以将域名按照 "." 进行分割,然后从根节点开始遍历 Trie 树,依次匹配每个域名的一级域名或二级域名,直到整个域名被匹配完毕。如果在匹配过程中遇到了空节点或者已经匹配到了最后一个域名,但是当前节点不是叶子节点,则说明该域名不在 DomainSet 中。
下面是实现代码:
```java
public class DomainSet {
private TrieNode root;
public DomainSet(Set<String> domains) {
root = new TrieNode();
for (String domain : domains) {
String[] parts = domain.split("\\.");
TrieNode node = root;
for (int i = parts.length - 1; i >= 0; i--) {
String part = parts[i];
if (!node.containsKey(part)) {
node.put(part, new TrieNode());
}
node = node.get(part);
}
node.setEnd();
}
}
public boolean contains(String domain) {
String[] parts = domain.split("\\.");
TrieNode node = root;
for (int i = parts.length - 1; i >= 0; i--) {
String part = parts[i];
if (!node.containsKey(part)) {
return false;
}
node = node.get(part);
if (node.isEnd()) {
return true;
}
}
return false;
}
private static class TrieNode {
private TrieNode[] children;
private boolean isEnd;
public TrieNode() {
children = new TrieNode[128];
isEnd = false;
}
public void put(String key, TrieNode node) {
children[key.charAt(0)] = node;
}
public TrieNode get(String key) {
return children[key.charAt(0)];
}
public boolean containsKey(String key) {
return children[key.charAt(0)] != null;
}
public boolean isEnd() {
return isEnd;
}
public void setEnd() {
isEnd = true;
}
}
}
```
在构造方法中,我们遍历所有的域名,将每个域名按照 "." 进行分割,然后从根节点开始逆序遍历域名的每一级,如果当前节点不存在某一级域名,则创建一个新的节点,并将其插入到当前节点的子节点中。在遍历到域名的最后一级时,将当前节点标记为结束节点。
在 contains 方法中,我们将要查询的域名按照 "." 进行分割,然后从根节点开始逆序遍历域名的每一级,如果当前节点不存在某一级域名,则说明该域名不在 DomainSet 中,返回 false。如果当前节点是结束节点,则说明该域名在 DomainSet 中,返回 true。如果遍历完整个域名后,都没有找到结束节点,则说明该域名不在 DomainSet 中,返回 false。
需要注意的是,在 TrieNode 类中,我们使用了一个长度为 128 的数组来存储子节点,这是因为一个域名中可能包含任意 ASCII 码字符。
阅读全文