0

郵便番号を指定して、都市を検索するためのプログラムを作成しようとしています。プログラムは、配列postalcodeでその郵便番号を検索し、都市の名前を返す必要があります。私がこれまでに持っているコードは次のとおりです。

import javax.swing.JOptionPane;

public class Postalcode 
{

    public static void main(String[] args) 
    {
        int[] postalcode = {9300,2000,1000,9200,9000,8500,9700,2300};
        String[] city = {"Aalst","Antwerpen","Brussel","Dendermonde","Gent","Kortrijk","Oudenaarde","Turnhout"};

        int code = Integer.parseInt(JOptionPane.showInputDialog("Give a postal code")); 
    }
}

私が抱えている問題は、要求されたコードを配列内の都市にリンクする方法がわからないことです。たとえば、ユーザーはコード2000と入力します。これは、postalcode [1]です。これは、city [1]であるため、必要な都市はアントワープです。

4

6 に答える 6

4

これには、2 つの配列の代わりに HashMap を使用することを真剣に検討します。

HashMap<int,String> cities =  new HashMap<int,String>();
cities.put(9000,"Gent");
cities.put(9400,"Aalst"); 
String city = cities.get(9400);
System.out.println(city);

割り当てにさらに適応するには:

 int code = Integer.parseInt(JOptionPane.showInputDialog("Give a postal code"));
 string city = cities.get(code);

編集:配列のソリューション:

これは私が言わなければならない非常に奇妙なアプローチですが、本当に配列でそれをしたいのであれば:

都市配列の長さは、郵便番号配列の長さと同じであると想定しています。

   int index = 0;
   int pCode = 9300;

for (int i = 0; i < postalcode.length; i ++)
{                       
  if (pCode == postalcode[i])
     {
        index = i;
        break;
     }

 }   

System.out.println(cities[index])   
于 2012-12-28T18:34:56.277 に答える
3
int code = Integer.parseInt(JOptionPane.showInputDialog("Give a postal code"));

int requiredIndex = -1;
for (int i = 0; i < postalcode.length; i++)
    if (postalcode[i] == code)
        requiredIndex = i;
if (requiredIndex == -1){
    //there is no such postal code
} else {
    //your city is
    System.out.println(city[requiredIndex]);
}
于 2012-12-28T18:36:54.297 に答える
2

実際、受け入れられた回答には、クエリごとに線形時間がかかります。aHashMapはまだより良いオプション (一定の償却時間) ですが、配列を並べ替えて並べ替えると、線形時間よりも優れた結果を得ることができますpostalCodeO(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 の配列に関する知識を向上させることなので、これらは良い例だと思います。

于 2012-12-28T20:15:56.120 に答える
1

最初の配列を検索するときに、成功したインデックスを保存し、他の配列のその要素を取得します。

    if(postalCode[i]==input)
        index=i;

そして今、あなたは欲しいcity[index]

index検索後に in にアクセスできるように、検索 for ループの外で宣言する必要があります (後でアクセスする必要がない場合を除きます)。

于 2012-12-28T18:37:58.657 に答える
1

配列でスキルを向上させたいので、これが役立つと思います。複雑でも効率的でもありませんが、これで十分です。

 int[] postalcode = {9300,2000,1000,9200,9000,8500,9700,2300};
     String[] city = {"Aalst","Antwerpen","Brussel","Dendermonde","Gent","Kortrijk","Oudenaarde","Turnhout"};

     int code = Integer.parseInt(JOptionPane.showInputDialog("Give a postal code")); 

     for(int i = 0; i< postalcode.length;i++){
         if(postalcode[i] == code){
          System.out.println(city[i]); 
              //or do something with the value here
         }
     }
于 2012-12-28T18:38:36.763 に答える
1

2 つの配列を使用することは実際cityにはこれを行う方法ではありませんが、あなたが持っているのは、対応するコードと同じインデックスにある都市のようですpostalcode

postalcode線形検索を実行してから、都市をプルする必要があります。

String foundCity = null;
for (int i = 0; i < postalcode.length; i++)
{
    if (postalcode[i] == code)
    {
        foundCity = city[i]; 
        break;   
    }
}

が null でない場合foundCityは、zip が見つかり、都市が表示されます。

于 2012-12-28T18:41:14.143 に答える