为邮政编码分配值

时间:2015-11-25 08:56:20

标签: java android

我要做的是为一组邮政编码分配一个数字值,然后使用该数字在程序中稍后进行计算。我现在拥有的是

if (zip == 93726 || zip == 93725 || zip == 92144) {
    return 100;
  }

else if (zip == 94550 || zip == 34599 || zip == 77375) {
    return 150;
  }

然后我接受变量并在计算中使用它。将数字分配给变量和计算全部工作,但我遇到的显然是android只允许你有这么多行代码,我只是使用if else语句用完了。我的问题是如何更好地解决这个问题?

我并不是想为每个拉链分配一个城市,因为我看到他们有其他海报提供的服务。

5 个答案:

答案 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)

    • 在某些地方,有些地方以0
    • 开头
    • 在某些地方,它们可能包含字母和数字
  1. 如果您使用ObjectStringInteger)作为常量,我经常使用Collection.contains(zip)作为条件的惰性快捷方式在每个if语句中。该集合包含该条件的所有常量,您可能会使用一个面向查找的子类,可能是HashSet。请记住,如果您按照其他地方的建议使用HashMap解决方案,那么您的密钥也将是Integer个对象,因此您无论如何都会对密钥进行哈希处理,您只需要存储收集建议中的结果值。

    我怀疑对于大量常量集合,散列可能比在==语句中处理大量if条件更快,直到达到正确的条件。 (如果最常用的常量出现在第一个if语句中,可能会有所帮助......)

  2. 在完全不同的注释(即策略而不是代码)上,您应该看看是否可以对ZIP进行分组。我的意思是,例如,如果您知道表格“923xx”和“924xx”的所有(或大多数) ZIP导致返回250,那么您可能会大大缩短您的条件。例如。 zip.startsWith("923") || zip.startsWith("923")String邮箱(zip / 100) == 923 || (zip / 100) == 924int 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
欢呼声。