我正在开发一个显示邮政编码和门牌号码的程序。我需要在第一列按升序对邮政编码进行排序,然后从左到右对门牌号码进行排序,并使用相同的邮政编码对其进行排序。 例如:
看起来像这样:
90153 | 9810 6037 8761 1126 9792 4070
90361 | 2274 6800 2196 3158 9614 9086
我希望它看起来像这样:
90153 | 1126 4070 6037 8761 9792 9810
90361 | 2186 2274 3158 6800 9086 9614
我使用以下代码对邮政编码进行排序,但如何对门牌号码进行排序?我是否需要添加一个循环来对此代码中的数字进行排序?如果是的话,在哪里?很抱歉,我无法正确缩进代码。
void DoubleArraySort()
{
int k,m,Hide;
boolean DidISwap;
DidISwap = true;
while (DidISwap)
{
DidISwap = false;
for ( k = 0; k < Row - 1; k++)
{
if ( Numbers[k][0] > Numbers[k+1][0] )
{
for ( m = 0; m < Col; m++)
{
Hide = Numbers[k ][m];
Numbers[k ][m] = Numbers[k+1][m];
Numbers[k+1][m] = Hide ;
DidISwap = true;
}
}
}
}
}
答案 0 :(得分:2)
使用像这样的对象ZipCode
:
public class ZipCode{
private String zipcode;
private ArrayList<String> adds
public ZipCode(String zip){
zipcode = zip;
adds = new ArrayList<String>();
}
public void addAddress(String address){
adds.add(address);
Collections.sort(adds);
}
}
保持一个ZipCodes
数组必须对它们进行排序:
ZipCode[] zips = . . .
.
.
.
Arrays.sort(zips);
答案 1 :(得分:0)
首先,您是否意识到Java提供了一种更有效的分拣机制?查看Arrays课程。
其次,你必须非常小心你的方法。你在这里做的是将一行中的所有元素与另一行交换。但是你并没有在每一行中做同样的事情。所以你需要一个单独的嵌套循环在当前时间(之前或之后,没有区别),它会检查房屋本身并对它们进行排序:
for ( k = 0; k < Row; k++)
{
do
{
DidISwap = false;
for ( m = 0; m < Col-1; m++)
{
if (Numbers[k][m] > Numbers[k][m+1])
{
Hide = Numbers[k][m];
Numbers[k][m] = Numbers[k][m+1];
Numbers[k][m+1] = Hide;
DidISwap = true;
}
}
}
while (DidISwap);
}
但是,您的方法效率很低。你为什么不把房子清单放在SortedSet中,然后创建一个SortedMap,从你的邮政编码映射到你的分类房屋?一切都将自动排序,效率更高。
您可以SortedMap
实施SortedSet
,{{1}}实施TreeMap。
答案 2 :(得分:0)
我/我们可以尝试告诉您如何修复(排序)您的代码以执行您想要的操作,但这会适得其反。相反,我将解释做这些事情的“Java方式”,(如果你遵循它)将提高你的工作效率,并使你的代码更易于维护。
遵循Java样式约定。特别是标识符约定。方法名称和变量名称应始终以小写字符开头。 (并尝试使用类,方法和变量名称来暗示类/方法/变量的含义。)
学习Java API并使用现有的标准库类和方法,而不是重新发明轮子。例如:
Arrays
和Collections
类具有排序数组和集合的标准方法。
有一些集合类型可以实现集合和映射等,可以处理“枯燥”的事情,比如按顺序保存元素。
如果您有复杂的数据结构,请使用现有的集合类型和自定义类构建它。不要试图将其表示为数字数组。成功的Java程序员使用高级设计和实现抽象。你的方法就像试图用手工制作的砖块建造一个多层停车场。
我的建议是获得一本关于面向对象编程的教科书(用Java编写),并以正确的方式设计和编写Java程序。现在投入努力将提高你的工作效率。