题目
文件names.txt (右键另存为)是一个46K大小的文本文件,包含5000多个英文名字。利用这个文件,首先将文件中的名字按照字母排序,然后计算每个名字的字母值,最后将字母值与这个名字在名字列表中的位置相乘,得到这个名字的得分。
例如将名字列表按照字母排序后, COLIN这个名字是列表中的第938个,它的字母值是 3+15+12+9+14=53 。所以COLIN这个名字的得分就是 938×53=49714 .
文件中所有名字的得分总和是多少?
解题方法
先读入这个文件,然后处理成从小到大排列的字符串数组。然后计算每个名字的字母值,乘上它的索引值,加到sum上,最后输出sum。
提示:names.txt内只有一行文本内容,开头的一些内容是,”MARY”,”PATRICIA”,”LINDA”,”BARBARA”,……
程序
// 因为存在I/O操作,可能会出现文件不存在等异常,所以必须申明throws Exception,调用slove()函数的函数也要申明throws Exception
public static void solve() throws Exception{
FileReader fr = new FileReader("D:/p022_names.txt");
BufferedReader br= new BufferedReader(fr);
// 文本内容就一行,所以只读取一次
String text = br.readLine();
// 输入输出用完要及时关闭
br.close();
fr.close();
// 清除文本中多余的引号
text = text.replace("\"", "");
// 以逗号为分隔符将字符串分割为字符数组
String[] names = text.split(",");
// 将字符串按从小到大排序
Arrays.sort(names);
int sum = 0;
for (int i=0;i<names.length;i++) {
int worth = 0;
char[] characters = names[i].toCharArray();
// 计算每个名字的值
for (char c:characters) {
// java和C一样,允许int和char型数据相互计算,'A' = 65
worth += c - 64;
}
sum += worth * (i + 1);
}
System.out.println(sum);
}