如何在不使用 HashMap 或任何其他集合的情况下将键值对存储在 Java 中?
How to store key value pairs in Java without using HashMap or any other collection?
我希望能够在不使用集合的情况下将值关联到某些键。我知道 HashMaps,但我正在尝试探索一种更基本的方法。
例如,如果我要计算文件中每个单词的出现频率,我会将单词作为键,将频率作为值。
有些语言也允许使用值访问数组。例如,Lua.
我还希望能够访问每个键及其值。
有两个大小相等的数组
String [] keys = new String [5];
String [] values = new String [5];
keys [0] = "name";
values [0] = "Fred";
String getValue (String key) {
// loop around keys array to get index of key
return values [index];
}
HashMap 是基本的。
使用两个并行数组效率极低。对于你读入的每一个单词,你都需要搜索keys数组,找到存储单词的索引,然后转到values数组中的相同位置并将该位置的值增加1.
使用二维数组也没有意义,因为您要存储的是字符串字和整数计数频率,而它们是不同的数据类型。
如果您要计算某个数字在文档中出现的次数,那么您可以轻松地使用单个数组,但如果您要计算字符串则不行。
对于您的情况,HashMap 确实是用于跟踪数据的理想数据结构。除非要求不使用 Collections,否则我建议至少尝试使用 HashMap。
Scanner file = new Scanner(new File("filename.txt"));
Map<String, Integer> map = new HashMap<String, Integer>();
while (file.hasNext()) {
String key = file.next();
Integer value = map.get(key);
if (value == null) {
map.put(key, 1);
}
else {
map.put(key, ++value);
}
}
创建一个包装器 class 来处理:
public class MyKeyValueClass {
public String key;
public String value;
public MyKeyValueClass(String key, String value) {
this.key = key;
this.value = value;
}
}
那是一个基地class。
如果你需要存储一些Pairs,使用Java class Pair
怎么样?这真的很简单:
new Pair<String, String>("key", "value").getValue();
还有classAbstractMap.SimpleEntry
更多信息:
- https://docs.oracle.com/javase/8/javafx/api/javafx/util/Pair.html
- https://docs.oracle.com/javase/7/docs/api/java/util/AbstractMap.SimpleEntry.html
- https://www.baeldung.com/java-pairs
不要重新发明轮子!
这可能是一个很好的面试问题,面试官想知道一种在不使用 HashMap 或任何其他集合的情况下实现键值对的方法。
在这里,我存储了字符串中所有字符的频率
static void countFrequencies(String str)
{
int n = str.length(); //here we are storing frequencies of all characters in string
int[] count = new int[MAX_CHAR];
for (int i = 0; i < n; i++)
count[str.charAt(i) - 'a']++;
}
或者可以使用 classes,基础 class 看起来像:-
class Key {
int freq; // store frequency of character
char ch;
Key(int val, char c)
{
freq = val;
ch = c;
}
}
我希望能够在不使用集合的情况下将值关联到某些键。我知道 HashMaps,但我正在尝试探索一种更基本的方法。
例如,如果我要计算文件中每个单词的出现频率,我会将单词作为键,将频率作为值。
有些语言也允许使用值访问数组。例如,Lua.
我还希望能够访问每个键及其值。
有两个大小相等的数组
String [] keys = new String [5];
String [] values = new String [5];
keys [0] = "name";
values [0] = "Fred";
String getValue (String key) {
// loop around keys array to get index of key
return values [index];
}
HashMap 是基本的。
使用两个并行数组效率极低。对于你读入的每一个单词,你都需要搜索keys数组,找到存储单词的索引,然后转到values数组中的相同位置并将该位置的值增加1.
使用二维数组也没有意义,因为您要存储的是字符串字和整数计数频率,而它们是不同的数据类型。
如果您要计算某个数字在文档中出现的次数,那么您可以轻松地使用单个数组,但如果您要计算字符串则不行。
对于您的情况,HashMap 确实是用于跟踪数据的理想数据结构。除非要求不使用 Collections,否则我建议至少尝试使用 HashMap。
Scanner file = new Scanner(new File("filename.txt"));
Map<String, Integer> map = new HashMap<String, Integer>();
while (file.hasNext()) {
String key = file.next();
Integer value = map.get(key);
if (value == null) {
map.put(key, 1);
}
else {
map.put(key, ++value);
}
}
创建一个包装器 class 来处理:
public class MyKeyValueClass {
public String key;
public String value;
public MyKeyValueClass(String key, String value) {
this.key = key;
this.value = value;
}
}
那是一个基地class。
如果你需要存储一些Pairs,使用Java class Pair
怎么样?这真的很简单:
new Pair<String, String>("key", "value").getValue();
还有classAbstractMap.SimpleEntry
更多信息:
- https://docs.oracle.com/javase/8/javafx/api/javafx/util/Pair.html
- https://docs.oracle.com/javase/7/docs/api/java/util/AbstractMap.SimpleEntry.html
- https://www.baeldung.com/java-pairs
不要重新发明轮子!
这可能是一个很好的面试问题,面试官想知道一种在不使用 HashMap 或任何其他集合的情况下实现键值对的方法。
在这里,我存储了字符串中所有字符的频率
static void countFrequencies(String str)
{
int n = str.length(); //here we are storing frequencies of all characters in string
int[] count = new int[MAX_CHAR];
for (int i = 0; i < n; i++)
count[str.charAt(i) - 'a']++;
}
或者可以使用 classes,基础 class 看起来像:-
class Key {
int freq; // store frequency of character
char ch;
Key(int val, char c)
{
freq = val;
ch = c;
}
}