我需要用街道名和数字填充数据库。
我必须为一个城市做这个,我有一个列表,其中包含以这种格式的街道名称:
街道名1
街道名2
街道名3
街道名4
街道名5a
街道名称20
街道名22
街道名24
街道名称27
街道名称29b
街道名33
等
现在我需要以这种格式获取数据:
街道名1-5 A
街道名称20-24 E.
街道名称27-29 O.
streetname 33 O.
对于偶数和对于所有
正如您所看到的那样,它需要按升序进行格式化,但如果街道号码中断,则需要修复它。 有些数字最后还包含a到c的字母
到目前为止,我只需要在我的.txt文件中读取一些基本代码 使用缓冲读取器,将文本输入保存在数组列表中,并使用一些正则表达式在控制台中输出。
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class test {
public static void main(String[] args) {
String[] arr= null;
String[] hn=null;
List<String> strassen = new ArrayList<String>();
List<String> hausnummern = new ArrayList<String>();
String endstr1 = "a";
String endstr2 = "b";
String endstr3 = "c";
String strhn[] = null;
int hn2;
try
{
FileInputStream fstream_strassen = new FileInputStream("Straßen.txt");
DataInputStream data_input = new DataInputStream(fstream_strassen);
BufferedReader buffer = new BufferedReader(new InputStreamReader(data_input));
FileInputStream fstream_strassen2 = new FileInputStream("Straßen.txt");
DataInputStream data_input2 = new DataInputStream(fstream_strassen2);
BufferedReader buffer2 = new BufferedReader(new InputStreamReader(data_input2));
String str_line;
String str_line2;
while (((str_line = buffer.readLine()) != null) && ((str_line2 = buffer2.readLine()) != null) )
{
str_line = str_line.trim();
str_line2 = str_line2.trim();
if ((str_line.length()!=0) && (str_line2.length()!=0))
{
strhn = str_line2.split("\\D+");
strassen.add(str_line);
hausnummern.add(str_line2);
}
}
hausnummern.toString();
hn = (String[])hausnummern.toArray(new String[hausnummern.size()]);
arr = (String[])strassen.toArray(new String[strassen.size()]);
}
catch (Exception e)
{
// Catch exception if any
System.err.println("Error: " + e.getMessage());
}
for(String s : arr) {
Matcher m = Pattern.compile("^(.*?) (\\d*?[a-zA-Z]{0,}?)$").matcher(s);
if(m.matches()) {
if(m.group(2).endsWith(endstr1)||m.group(2).endsWith(endstr2)||m.group(2).endsWith(endstr3)==true){
hn2 = Integer.parseInt(m.group(2).substring(0, m.group(2).length()-1));
if(m.group(2).endsWith(endstr1) == true){
System.out.printf("%s %s %s\n", m.group(1), hn2, endstr1);
/*if(hn2 % 2 != 0){
System.out.printf("%s %s %s\n", str, hn2, endstr1);
}*/
}
if(m.group(2).endsWith(endstr2) == true){
System.out.printf("%s %s %s\n", m.group(1), hn2, endstr2);
/*if(hn2 % 2 != 0){
System.out.printf("%s %s %s\n", str, hn2, endstr2);
}*/
}
if(m.group(2).endsWith(endstr3) == true){
System.out.printf("%s %s %s\n", m.group(1), hn2, endstr3);
/*if(hn2 % 2 != 0){
System.out.printf("%s %s %s\n", str, hn2, endstr3);
}*/
}
}
else{
hn2 = Integer.parseInt(m.group(2));
System.out.printf("%s %s\n", m.group(1), hn2);
}
}
}
}
}
我的输出如下:
Ihmenkampsweg 1
Ihmenkampsweg 2 a
Ihmenkampsweg 2 b
Ihmenkampsweg 4
Ihmenkampsweg 5
Ihmenkampsweg 9
Ihmenkampsweg 10 a
Ihmenkampsweg 10 b
Ihmenkampsweg 11
Ihmenkampsweg 12 a
Ihmenkampsweg 12 b
Ihmenkampsweg 14 a
Ihmenkampsweg 14 b
Ihmenkampsweg 16 a
Ihmenkampsweg 16 b
Ihmenkampsweg 18
Ihmenkampsweg 20
现在我需要帮助来整理整个列表。就像上面的例子一样,程序应该输出:
Ihmenkampsweg 1 O.
Ihmenkamsweg 2-4 E.
Ihmenkampsweg 5 O.
Ihmenkampsweg 9-11 O.
Ihmenkampsweg 12-20 E
所以它需要按照升序排序,按奇数和偶数排序,如果它正在进行中 我考虑过分拆街道名称和号码,并证明它是否奇怪,我可以用以下方法测试:if(number%2!= 0)如果没有,那就很奇怪了偶数。
但我不知道如何总结所有奇数,偶数和/或所有街道。 也许我可以做一个循环测试streetname是否像之前一样,数字+2等于数组中的下一个数字。 我希望有人可以帮我一些实际的代码,我会坚持这几天;(
答案 0 :(得分:0)
(我不知道为什么会编辑你的一些代码)
你正在寻求帮助,所以我会给你一些建议:
Street
类,其中包含街道名称,街道编号和字母,如果它是奇数/甚至是您想要的话)ArrayList
Street
并添加每条街道(而不是像你正在做的那样打印它们)。您可能想尝试使用ArrayList
而不是数组,它更干净。Array.sort(...)
和Comparator
)。如果您确定它已经订购,那就不要打扰了。Street ArrayList
上循环:将第一个保存在变量中,然后继续循环,然后在下一个比较数字:测试它是否是相同的街道和相同的数字范围。这样循环直到测试失败(不同的街道/数字范围)然后打印街道的第一个数字和最后一个数字。对每个街道范围重复此操作。首先执行此操作,然后您可以处理打印赔率甚至街道的情况。如果它很难,简化它,不要考虑a / b / c,juste streetname和number,那么你可以回去测试街头小贩。之后,您还应检查范围内是否只有一条街道(例如,将Ihmenkampsweg 50 b
添加到您的测试用例中)。