其实,接受的答案每个查询需要线性时间。虽然HashMap
仍然是一个更好的选择(具有不变的分摊时间),但如果重新排列它们以便对postalCode
进行排序,则可以比使用数组的线性时间做得更好。这使您可以执行O(log(n))
二进制搜索。
例子:
final int[] orderedPostCode = { 1000, 2000, 2300, 8500, 9000, 9200, 9300, 9700 };
final String[] orderedCities = { "Brussel", "Antwerpen", "Turnhout", "Kortrijk", "Gent", "Dendermonde", "Aalst", "Oudenaarde" };
final int code = Integer.parseInt(JOptionPane.showInputDialog("Give a postal code"));
final int codePos = Arrays.binarySearch(orderedPostCode, code);
if (codePos < 0) {
JOptionPane.showMessageDialog(null, "Postal code not found", "Error", JOptionPane.ERROR_MESSAGE);
}
else {
JOptionPane.showMessageDialog(null, "City: " + orderedCities[codePos]);
}
这就导致了一个有趣的跟进问题:如何排序的邮政编码和城市需要快速的二进制搜索的方式任意一组:
int[] postalCode = {9300,2000,1000,9200,9000,8500,9700,2300};
String[] city = {"Aalst","Antwerpen","Brussel","Dendermonde","Gent","Kortrijk","Oudenaarde","Turnhout"};
int[] orderedPostCode = Arrays.copyOf(postalCode, postalCode.length);
Arrays.sort(orderedPostCode);
String[] orderedCities = rearrangeCities(city, postalCode, orderedPostCode);
System.out.println(Arrays.toString(orderedPostCode));
System.out.println(Arrays.toString(orderedCities));
// Will print the arrays of the first example
这里是rearrangeCities
执行O(n²)
:
private static String[] rearrangeCities(String[] cities, int[] postalCode, int[] orderedPostCode) {
final String[] orderedCities = new String[cities.length];
for (int newPos = 0; newPos < orderedPostCode.length; newPos++) {
final int curPostalCode = orderedPostCode[newPos];
for (int oldPos = 0; oldPos < postalCode.length; oldPos++) {
if (postalCode[oldPos] == curPostalCode) {
orderedCities[newPos] = cities[oldPos];
break;
}
}
}
return orderedCities;
}
既然你的目标是提高你对Java数组的知识,我相信这些都是很好的例子。
你将*更好地服务于'Map'。 –
Makoto
你打开数组以外的其他选择吗?在你的情况下,一个地图将是你的给定场景的良好数据结构 – KyelJmD
我以前没有使用过地图,我试图提高我对java中数组的知识。所以我想用数组来做这个程序 – STheFox