【发布时间】:2012-06-19 15:23:34
【问题描述】:
是否可以在 Java 中创建一个由字母字符('a' 到 'z')而不是整数索引的数组?
有了这样一个数组“a”,我想这样用,比如
print (a['a']);
【问题讨论】:
是否可以在 Java 中创建一个由字母字符('a' 到 'z')而不是整数索引的数组?
有了这样一个数组“a”,我想这样用,比如
print (a['a']);
【问题讨论】:
是否可以在 Java 中创建以字母字符为索引的数组 ('a' to 'z') 而不是整数?
当然可以。
你可以这样做:
char theChar = 'x';
print (a[theChar - 'a']);
或假设只处理 ASCII 字符串只需声明大小为 256 的数组。使用您的字符直接索引数组。
char[] a = new char[256];
char theChar = 'x';
print (a[theChar]);
现在你不在乎它是大写/小写还是什么。
实际上,如果您对特别是 ASCII 字符串感兴趣,使用 Map 与简单的数组相比可能会有点过分。该数组不会浪费太多空间,对于这样一个简单的任务来说,Map(一个非常有效的构造)可能太多了。
【讨论】:
请改用Map。
Map<Character, Object> myMap = new HashMap<Character, Object>();
myMap.put('a', something);
print(myMap.get('a'));
另一方面,正如其他人已经建议的那样,您可以使用 char 作为索引(但您会将所有数组元素 0...'a'-1 留空):
String[] a = new String['z' + 1];
a['a'] = "Hello World";
System.out.println(a['a']);
【讨论】:
new String['z' + 1] 创建一个大小为 123 的数组。最好将其声明为 new String[128] 以处理基本 ASCII 或 new String[256] 以完全处理 ASCII 字符。
您可以创建一个包含 26 个元素的数组,并始终从您的字符索引中减去 'a':
int[] array = new int[26];
array['a'-'a']=0;
array['b'-'a']=1;
\\ etc...
【讨论】:
像这样简单的东西呢?
public static int getLetterValue(char letter) {
return (int) Character.toUpperCase(letter) - 64;
}
并像这样使用它:
System.out.println(a[getLetterValue('a'));
就目前而言,这将非常失败。您需要检查它是否在范围内等。
或者,您可以实现 Java List 接口并覆盖 .get 和 .add 方法,以便它们可以使用字符。但这让我想到了下一点。
最好使用能够更好地处理异常并且专为此类用例设计的数据结构。 Map 是更好的选择。
【讨论】:
是和不是。是的,因为你可以做到并且它会编译。试试下面的代码:
class foo {
public static void main(String[] args) throws Exception {
int a[] = new int[100];
a['a'] = '1';
System.out.printf("%d\n", a['a']);
}
}
不,因为字符将被隐式转换为整数,这听起来不像您要查找的内容。
【讨论】:
您要查找的数据结构在 Java 领域称为 Map。
这种数据结构有多种名称,例如 PHP 中的关联数组; C#、Python 中的字典; Ruby 等中的 hash 会导致这种混乱。
【讨论】:
你可以这样做:- 例如:
char[] a = new char[]{'s','t'};
int[] result = new int[256];
result[a[0]]= 100;
System.out.println(result['s']);//will print 100
【讨论】:
不,你不能那样做。在这种情况下,您应该改用Map。
【讨论】:
我认为这是一个重复的问题!见Can Java use String as an index array key? (ex: array["a"]=1;)。
您应该使用映射将字母映射到值并调用 get 来获取值。
【讨论】: