我要做的是为一组邮政编码分配一个数字值,然后使用该数字在程序中稍后进行计算。我现在拥有的是
if (zip == 93726 || zip == 93725 || zip == 92144) {
return 100;
}
else if (zip == 94550 || zip == 34599 || zip == 77375) {
return 150;
}
然后我接受变量并在计算中使用它。将数字分配给变量和计算全部工作,但我遇到的显然是android只允许你有这么多行代码,我只是使用if else语句用完了。我的问题是如何更好地解决这个问题?
我并不是想为每个拉链分配一个城市,因为我看到他们有其他海报提供的服务。
答案 0 :(得分:1)
一个。你可以使用
switch (zip)
{
case 93726: case 93725: case 92144: return 100;
case 94550: case 34599: case 77375: return 150;
}
-
湾或者创建一个HashMap<Integer,Integer>
并用“zip to value”条目填充它,如果你有这么多的情况,这应该会给你带来更好的表现。
Map<Integer,Integer> m = new HashMap<>();
m.put(93726,100);
以后你可以打电话
return m.get(zip);
-
℃。如果你的拉链数量达到数万并且你想在内存中工作,那么你应该考虑只持有十万个int大小的数组:
int[] arr=new int[100000];
并填写数据:
arr[93726]=100;
.
.
.
答案 1 :(得分:1)
如果您使用Object
(String
或Integer
)作为常量,我经常使用Collection.contains(zip)
作为条件的惰性快捷方式在每个if语句中。该集合包含该条件的所有常量,您可能会使用一个面向查找的子类,可能是HashSet
。请记住,如果您按照其他地方的建议使用HashMap
解决方案,那么您的密钥也将是Integer
个对象,因此您无论如何都会对密钥进行哈希处理,您只需要存储收集建议中的结果值。
我怀疑对于大量常量集合,散列可能比在==
语句中处理大量if
条件更快,直到达到正确的条件。 (如果最常用的常量出现在第一个if
语句中,可能会有所帮助......)
在完全不同的注释(即策略而不是代码)上,您应该看看是否可以对ZIP进行分组。我的意思是,例如,如果您知道表格“923xx”和“924xx”的所有(或大多数) ZIP导致返回250,那么您可能会大大缩短您的条件。例如。 zip.startsWith("923") || zip.startsWith("923")
个String
邮箱(zip / 100) == 923 || (zip / 100) == 924
或int
http://localhost/test/a.php/b
。
仍然可以处理少数更具体的组例外,您只需要在更一般的条件之前获得更具体的条件。
答案 2 :(得分:0)
使用声明性数据。特别是因为邮政编码可能会更新,扩展,更正:
使用例如zip.properties
points = 100, 150
zip100 = 93726, 93725, 92144
zip150 = 94550, 34599, 77375,\
88123, 12324, 23424
和
Map<Integer, Integer> zipToPoints = new HashMap<>();
如果你得到带有前导零的邮政编码,可能最好使用String或注意用基数10解析它们(前导零是基数8,八进制)。
是否真的存在这样的限制我不知道,但是一些编码的额外努力值得将所有数据作为数据。
答案 3 :(得分:0)
您可以创建一个Map
,将每个邮政编码映射为一个整数。例如:
Map<Integer, Integer> zipCodeMap = new HashMap<>();
zipCodeMap.put(93726, 100);
稍后您可以从那里检索值。
Integer value = zipCodeMap.get(93726);
现在您仍然需要将每个邮政编码映射到一个值。我不会在Java代码中这样做,而是使用数据库或从文本文件中读取(例如csv)。这主要取决于您的要求。
示例csv文件:
93726, 100
93727, 100
93726, 150
从csv文件中读取:
InputStream is = this.class.getResourceAsStream("/data.csv");
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
try {
String line;
while ((line = reader.readLine()) != null) {
String[] row = line.split(",");
int zip = Integer.parseInt(row[0].trim());
int value = Integer.parseInt(row[1].trim());
zipCodeMap.put(zip, value);
}
}
catch (IOException ex) {
// handle exceptions here
}
finally {
try {
is.close();
}
catch (IOException e) {
// handle exceptions here
}
}
答案 4 :(得分:0)
拥有邮政编码的地图。只需返回值
Private Sub btnSplitJobs_Click()
Dim i As Long, j As Long, k As Long, strWS As String, rngCPY As Range
With Application: .ScreenUpdating = False: .EnableEvents = False: .CutCopyMode = False: End With
If Range("L9") = "" Then: MsgBox "You can't Split the Jobs at this stage. " & vbLf & vbLf & "Please create the form for the Sub-Contractor First." & vbLf & vbLf & "Please press Display Utilities to create form.", vbExclamation, "Invalid Operation": Exit Sub
Dim lastG As Long: lastG = sheets("Global").Cells(Rows.Count, "Q").End(xlUp).row
Dim cVat As Boolean: cVat = InStr(1, sheets("Payment Form").Range("A20").value, "THE VAT SHOWN IS YOUR OUTPUT TAX DUE TO CUSTOMS AND EXCISE")
If sheets("PAYMENT FORM").Cells(35 - cVat * 5, 12) >= 1 Then: MsgBox "It appears you have already split the jobs, this operation can only be performed once.", vbExclamation, "Invalid Operation": Exit Sub
For j = 0 To UserForm2.ComboBox2.ListCount - 1
currval = UserForm2.ComboBox2.List(j, 0)
For i = 3 To lastG
If currval = sheets("Global").Cells(i, "Q") Then
k = i
strWS = UserForm2.ComboBox2.List(j, 1)
On Error Resume Next '<~~ if the worksheet in the next line does not exist, go make one
If Len(Worksheets(strWS).Name) = 0 Then
With ThisWorkbook
On Error GoTo 0
Dim nStr As String: With sheets("Payment Form").Range("C9"): nStr = Right(.value, Len(.value) - Len(Left(.value, InStr(.value, "- ")))): End With
Dim CCName As Variant: CCName = UserForm2.ComboBox2.List(j, 2)
Dim lastRow As Long: lastRow = sheets("Payment Form").Range("U36:U53").End(xlDown).row
Dim strRng As String: strRng = Array("A18:A34", "A23:A39")(-1 * cVat)
Dim lastRow2 As Long: lastRow2 = sheets("Payment Form").Range(strRng).End(xlDown).row
Dim wsTemplate As Worksheet: Set wsTemplate = ThisWorkbook.sheets("Template")
Dim wsNew As Worksheet
With sheets("Payment Form")
For Each cell In .Range(strRng)
If Len(cell) = 0 Then
If sheets("Payment Form").Range("C9").value = "Network" Then
cell.Offset.value = strWS & " - " & nStr & ": " & CCName
Else
cell.Offset.value = strWS & " -" & nStr & ": " & CCName
End If
Exit For
End If
Next cell
End With
With wsNew
wsTemplate.Visible = True
wsTemplate.Copy before:=sheets("Details"): Set wsNew = ActiveSheet
wsTemplate.Visible = False
wsNew.Name = strWS
wsNew.Range("D4").value = sheets("Payment Form").Range(strRng).End(xlDown).value
wsNew.Range("D6").value = sheets("Payment Form").Range("L11").value
wsNew.Range("D8").value = sheets("Payment Form").Range("C9").value
wsNew.Range("D10").value = sheets("Payment Form").Range("C11").value
End With
With .sheets("Payment Form")
.Activate
.Range("J" & lastRow2 + 1).value = 0
.Range("L" & lastRow2 + 1).Formula = "=N" & lastRow2 + 1 & "-J" & lastRow2 + 1 & ""
.Range("N" & lastRow2 + 1).Formula = "='" & strWS & "'!L20"
.Range("U" & lastRow + 1).value = strWS & ": "
.Range("V" & lastRow + 1).Formula = "='" & strWS & "'!I21"
.Range("W" & lastRow + 1).Formula = "='" & strWS & "'!I23"
.Range("X" & lastRow + 1).Formula = "='" & strWS & "'!K21"
End With
End With
End If '<~~~ end new sheet
While sheets("Global").Cells(k + 1, 17).value = currval And k < lastG
k = k + 1
Wend
Set rngCPY = sheets("Global").Range("Q" & i & ":Q" & k).EntireRow
With Worksheets(strWS)
rngCPY.Copy
.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Insert shift:=xlDown
End With
i = k
End If
Next i
Next j
With Application: .ScreenUpdating = True: .EnableEvents = True: .CutCopyMode = True: End With
End Sub
。
。
等等。或者您可以从道具文件中读取并填充地图
然后而不是使用if(s),
Map<Integer,Integer> zipValues = new HashMap<Integer,Integer>();
zipValues.put(93726,100);
所以说zipCode = 93726,它会返回你100
欢呼声。