2013-03-26 2 views
1

저는 vb.net을 처음 사용하기 때문에 몇 시간 동안 검색 한 후에도 특정 도움말을 찾을 수 없습니다.두 번째로 낮은 값을 반환하는 반복 프로세스

나는 세 개의 열이있는 데이터 표를 가지고 있는데, 열 1은 "point id"이고 열 2는 "x 좌표"이며 열 3은 "y 좌표"입니다. 네 번째 열을 추가 한 다음이 값을 반복 프로세스의 두 번째로 낮은 값으로 채워야합니다.

반복되는 프로세스는 그 지점에서 다른 지점까지의 거리를 찾는 것이고 가장 낮은 값은 0 (자체와의 거리)이므로 두 번째로 낮은 값을 반환합니다. 점 1과 점 2 사이의 거리에 대한 수학은 sqrt입니다 (((x2-x1) (x2-x1)) + ((y2-y1) (y2-y1)))).

나는 하나의 값을 되 돌리는 반복적 인 과정에서 반복적 인 과정을 수행하는 것을 성급하게보고있다.

은 어떤 도움이 크게 apprecited 될 것이다 :

+0

지금까지 코드가 있습니까? 혹은 아무것도 아닌? –

답변

1

으로 반복 테이블에서 행을. 그런 다음 각 행에 대해 테이블의 행을 반복합니다. 그러나 기본 반복이 현재 실행중인 행에 도달하면 해당 반복을 건너 뛸 수 있습니다. 또한 거리는 쌍의 점 사이에 있으므로 모든 거리를 얻으려면 테이블의 행 절반 만 반복하면됩니다.

코드를 구현하는 방법에 대한 자세한 정보를 게시하면 일부 코드로는 도움이 될 수도 있지만 현재와 같이 테이블의 종류 나 사용 방법을 말하지 않아도됩니다. 프로그램이 설정되어 있으므로 더 구체적으로 설명하기가 어렵습니다.

1

가능한 해결책은 [테스트되지 않음]입니다. AddNearestColumn() 메서드는 각 행을 반복하며 테이블의 다른 점까지의 거리 목록을 가져옵니다. 그런 다음 목록을 반복하고 가장 작은 값을 얻습니다. 수동으로 반복하지 말고 distances.Sort()AddNearestColumn()에 사용해야합니다.하지만 그 대신 떠날 것입니다. :-)

Public Sub ProcessTable(table As Data.DataTable) 
    AddNearestColumn(table) 
End Sub 

Private Sub AddNearestColumn(table As Data.DataTable) 
    table.Columns.Add("Nearest", GetType(Double)) 
    For Each r As Data.DataRow In table.Rows 
     Dim distances As List(Of Double) = GetDistancesFromPoint(table, r) 
     Dim nearest As Double = Double.MaxValue 
     For Each distance As Double In distances 
      If (distance < nearest) Then nearest = distance 
     Next 
     r.Item("Nearest") = nearest 
    Next 
End Sub 

Private Function GetDistancesFromPoint(table As Data.DataTable, referenceRow As Data.DataRow) As List(Of Double) 
    Dim output As New List(Of Double) 
    For Each r As Data.DataRow In table.Rows 
     Dim referenceId As String = CStr(referenceRow.Item("ID")) 
     Dim rowId As String = CStr(r.Item("ID")) 
     If (rowId = referenceId) Then Continue For 
     Dim x1 As Double = Convert.ToDouble(referenceRow.Item("X")) 
     Dim y1 As Double = Convert.ToDouble(referenceRow.Item("Y")) 
     Dim x2 As Double = Convert.ToDouble(r.Item("X")) 
     Dim y2 As Double = Convert.ToDouble(r.Item("Y")) 
     output.Add(Math.Sqrt(((x2 - x1) * (x2 - x1)) + ((y2 - y1) * (y2 - y1)))) 
    Next 
    Return output 
End Function 
+0

답장을 보내 주셔서 감사합니다.이 코드를 기존 코드에 넣으려고했지만 "System.Data.Datarow '형식의 값을 Integer로 변환 할 수 없습니다."라는 오류 메시지가 나타납니다. 나는 당신의 코드에서 r이 "희미한"것이 아니라는 것을 알아 차렸다. 이것이 오류의 원인인가? –

+0

필자는 필자의 원래 대답을 메모장에서 치고 실수로 각'Item'의 끝에'.Value'를 넣었습니다. 업데이트 된 코드를 참조하십시오. – nunzabar

+0

죄송합니다 다시 죄송합니다, 코드를 실행하면 "double x2 dim"점에 도착합니다. "개체를 DBNull에서 캐스팅 할 수 없습니다."라는 오류가 나타납니다. 어떤 아이디어? –

관련 문제