차이를 기준으로 배열을 10의 배 수당 한 행으로 필터링 하시겠습니까?

SRY_JAVA

결과 집합의 값을 보유하는 배열이 있습니다. 배열을 검색하는 코드의 개요는 다음과 같습니다.

public String[][] ref_Details() {
  int i = 0;
  String a[][] = new String[47][11];
  try
  {  
    con = getConnection();
    stmt = con.createStatement();
    String sql=" select b.LOGTIME, b.beam_current, b.beam_energy ..."; // shortened
    stmt.executeQuery(sql);
    rs = stmt.getResultSet();

    while(rs.next()) {
      for(int j=0; j<11; j++)
        a[i][j] = rs.getString(j+1);

      i++;
    }
  }
  catch( Exception e ) { ... }
  finally {
    closeConnection(stmt, rs, con);
  }
  return a;
}

얻은 샘플 테이블은 다음과 같습니다.

여기에 이미지 설명 입력

표에서 두 번째 열에 beam_current는 0에서 220까지의 각 정수 배수에 가까운 값이 있음이 분명합니다 . (0, 10, 20 ... 220). 10의 배수마다 그 배수에 가장 가까운 행만 선택하도록 데이터 세트를 필터링하고 싶습니다. 이를 위해 나는 :

  1. 의 모든 행에서 10을 빼고 beam_current얻은 차이를 찾으십시오. 차이가 가장 작은 행이 10의 배수에 관심이있는 유일한 행입니다. T
  2. 모든 행에서 총 220 개를 뺄 때까지 1 단계를 반복합니다.

내 예상 결과는 샘플 데이터의 원래 47 행 대신 22 행입니다. 예를 들어 위의 샘플 데이터 그림에서 번호가 21 인 행은 값에 대해 선택된 행에 해당합니다 130.

내 문제는 내가 예상 한 결과를 볼 수 없다는 것입니다. 내가 시도한 코드는 다음과 같습니다.

public int[] ref_BeamCurrent() {
  int i = 0;
  int[] arr = new int[47];
  try
  {  
    con = getConnection();
    ...
    rs = stmt.getResultSet();

    while(rs.next()) 
    { 
      for(i=0; i<arr.length; i++)
      {
        arr[i] = rs.getInt(2);
        System.out.println(arr);
        while (i < arr.length && number <= 210)
        {
          arr[i] = arr[i] - number;
          System.out.println(arr);
          number = number + 10;
          System.out.println(number);
          i = i + 1;
          // System.out.println(arr);
        }
      }
    }
  }
  catch( Exception e ) { ... }
  finally { ... }
  return arr;
}

이 코드는 완전히 잘못된 행을 선택하는 것 같습니다. 내가 뭘 잘못하고 있습니까?

앤디 브라운

다른 방식으로 생각해야한다고 생각합니다. 당신이 원하는 것은 각 행에 대해 10의 배수에서 거리를 찾는 것입니다.

  • 10의 가장 가까운 배수는 다음 식으로 주어집니다. double mult = 10d * Math.round(v / 10d)
  • 10의 배수로부터의 거리는 다음 식으로 주어집니다. double delta = Math.abs(v - mult)
  • 의 모든 값에 mult대해 원하는 행은 가장 작은 delta값을 가진 행 입니다.

따라서 행을 한 번만 반복하면됩니다.

  1. 받기 beam_value행과 그것의 발견 multdelta.
  2. 행의이 경우 delta가까운 이전에 발견 된 것보다 delta위해 mult, 그 다음에 그 행을 기록 mult, 그렇지 않으면 무시한다.
  3. 더 이상 행이 없을 때까지 반복하십시오.

또한이 접근 방식은 다른 접근 방식으로는 방지하기 어려운 10의 배수 이상에 대해 단일 행이 기록되는 것을 방지합니다.

예를 들어 (그리고 SQL 쿼리가 없기 때문에 데이터를 가짜로 만들었습니다). 입력 데이터 :

`0.5, 12.10, 13.00, 16.01, 21.52`

올바른 출력을 제공합니다 (인덱스 1은 10인덱스 2보다 더 가깝고 인덱스 4는 20인덱스 3보다 더 가깝습니다 ).

   10x 행 값
     0 0 0.5000
    10 1 12.1000
    20 4 21.5200

코드 :

public static void findClosestRowsToMultiplesOfTen() {
    // fake row values
    double[] vals = new double[]{ 0.5, 12.10, 13.00, 16.01, 21.52 };

    //  get the max value, and its multiple of ten to get the number of buckets
    double max = Double.MIN_VALUE;
    for (double v : vals) max = Math.max(max, v);
    int bucketCount = 1 + (int)(max/10);

    //  initialise the buckets array to store the closest values
    double[][] buckets = new double[bucketCount][3];
    for (int i = 0; i < bucketCount; i++){
        // store the current smallest delta in the first element
        buckets[i][0] = Double.MAX_VALUE; 
        // store the current "closest" index in the second element
        buckets[i][1] = -1d;
        // store the current "closest" value in the third element
        buckets[i][2] = Double.MAX_VALUE;
    }

    //  iterate the rows
    for (int i = 0; i < vals.length; i++)
    {
        //  get the value from the row
        double v = vals[i];
        //  get the closest multiple of ten to v
        double mult = getMultipleOfTen(v);
        //  get the absolute distance of v from the multiple of ten
        double delta = Math.abs(mult - v);
        //  get the bucket index based on the value of `mult`
        int bIdx = (int)(mult / 10d);
        //    test the last known "smallest delta" for this bucket
        if (buckets[bIdx][0] > delta)
        {
            //  this is closer than the last known "smallest delta"
            buckets[bIdx][0] = delta;
            buckets[bIdx][1] = i;
            buckets[bIdx][2] = v;
        }
    }

    //   print out the result
    System.out.format("    10x row value%n");
    for (int i = 0; i < buckets.length; i++)
    {
        double[] bucket = buckets[i];
        int multipleOfTen = i * 10;
        double rowIndex = bucket[1];
        double rowValue = bucket[2];
        System.out.format("    %,2d %,4.0f %.4f%n", 
          multipleOfTen, rowIndex, rowValue);
    }
}
public static double getMultipleOfTen(double v)
{
    return 10d * Math.round(v / 10d);
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

차이를 기준으로 배열을 10의 배 수당 한 행으로 필터링 하시겠습니까?

분류에서Dev

JS는 수도를 기준으로 객체 배열을 먼저 필터링 한 다음 알파벳순으로 필터링합니다.

분류에서Dev

데이터의 다른 배열을 기준으로 객체 배열 필터링

분류에서Dev

일부 기준으로 배열의 하위 배열 필터링

분류에서Dev

두 개의 열을 기준으로 필터링하면서 powerbi에서 고유 한 행 수를 얻는 방법

분류에서Dev

다른 요소에서 발생하는 횟수를 기준으로 객체의 속성 값을 기준으로 배열 필터링

분류에서Dev

중첩 배열의 값을 기준으로 배열 필터링

분류에서Dev

필터링 된 하위 문서 배열 요소 수를 기준으로 정렬

분류에서Dev

Google 시트 필터링을 수행하는 방법은 무엇입니까? 한 열의 데이터를 한 셀로 그룹화 하시겠습니까?

분류에서Dev

배열의 배열 필터링,이 작업을 수행하는 우아한 방법이 있습니까?

분류에서Dev

중첩 배열을 기준으로 이름으로 필터링

분류에서Dev

다양한 수준의 깊이로 다차원 배열을 재귀 적으로 진행합니다.

분류에서Dev

MYSQL : 다른 테이블의 개수를 기준으로 필터링 하시겠습니까?

분류에서Dev

값을 기준으로 배열의 객체를 필터링하는 가장 빠른 방법

분류에서Dev

하나의 배열을 가져 와서 배열이 3으로 나눌 수없는 경우 3 개의 동일한 배열을 반환합니다. 더 작은 배열의 크기를 늘리시겠습니까?

분류에서Dev

값을 기준으로 배열을 필터링하는 방법

분류에서Dev

효율적인 방법으로 NET Core에서 한 데이터 유형의 배열을 다른 배열로 변환 하시겠습니까?

분류에서Dev

한 형식의 JSON 배열 데이터를 다른 형식으로 변환 하시겠습니까?

분류에서Dev

두 개의 객체 배열이 다른 키를 기준으로 하나를 필터링해야합니다.

분류에서Dev

숫자로 배열을 필터링 하시겠습니까?

분류에서Dev

Angular.js의 공통 객체 속성으로 배열을 필터링 하시겠습니까?

분류에서Dev

가장 높은 점수를 기준으로 배열의 사용자 이름 필터링

분류에서Dev

mysql-한 열의 값 수를 기준으로 쿼리 결과를 필터링합니까?

분류에서Dev

다른 배열로 배열을 필터링하고 새 객체를 만드시겠습니까?

분류에서Dev

객체 배열을 필터링하고 배열에 표시되는 횟수를 기준으로 정렬하는 방법

분류에서Dev

한 열의 공통 값을 기반으로 두 열 배열 필터링

분류에서Dev

열의 고유 한 속성을 기반으로 배열의 데이터 행을 어떻게 비교할 수 있습니까?

분류에서Dev

술어의 핵심 인 다른 배열을 기반으로 술어를 사용하여 배열 필터링

분류에서Dev

SwiftUI의 ForEach에서 @Binding 배열 var를 필터링하면 필터링되지 않은 배열을 기반으로 값이 반환됩니다.

Related 관련 기사

  1. 1

    차이를 기준으로 배열을 10의 배 수당 한 행으로 필터링 하시겠습니까?

  2. 2

    JS는 수도를 기준으로 객체 배열을 먼저 필터링 한 다음 알파벳순으로 필터링합니다.

  3. 3

    데이터의 다른 배열을 기준으로 객체 배열 필터링

  4. 4

    일부 기준으로 배열의 하위 배열 필터링

  5. 5

    두 개의 열을 기준으로 필터링하면서 powerbi에서 고유 한 행 수를 얻는 방법

  6. 6

    다른 요소에서 발생하는 횟수를 기준으로 객체의 속성 값을 기준으로 배열 필터링

  7. 7

    중첩 배열의 값을 기준으로 배열 필터링

  8. 8

    필터링 된 하위 문서 배열 요소 수를 기준으로 정렬

  9. 9

    Google 시트 필터링을 수행하는 방법은 무엇입니까? 한 열의 데이터를 한 셀로 그룹화 하시겠습니까?

  10. 10

    배열의 배열 필터링,이 작업을 수행하는 우아한 방법이 있습니까?

  11. 11

    중첩 배열을 기준으로 이름으로 필터링

  12. 12

    다양한 수준의 깊이로 다차원 배열을 재귀 적으로 진행합니다.

  13. 13

    MYSQL : 다른 테이블의 개수를 기준으로 필터링 하시겠습니까?

  14. 14

    값을 기준으로 배열의 객체를 필터링하는 가장 빠른 방법

  15. 15

    하나의 배열을 가져 와서 배열이 3으로 나눌 수없는 경우 3 개의 동일한 배열을 반환합니다. 더 작은 배열의 크기를 늘리시겠습니까?

  16. 16

    값을 기준으로 배열을 필터링하는 방법

  17. 17

    효율적인 방법으로 NET Core에서 한 데이터 유형의 배열을 다른 배열로 변환 하시겠습니까?

  18. 18

    한 형식의 JSON 배열 데이터를 다른 형식으로 변환 하시겠습니까?

  19. 19

    두 개의 객체 배열이 다른 키를 기준으로 하나를 필터링해야합니다.

  20. 20

    숫자로 배열을 필터링 하시겠습니까?

  21. 21

    Angular.js의 공통 객체 속성으로 배열을 필터링 하시겠습니까?

  22. 22

    가장 높은 점수를 기준으로 배열의 사용자 이름 필터링

  23. 23

    mysql-한 열의 값 수를 기준으로 쿼리 결과를 필터링합니까?

  24. 24

    다른 배열로 배열을 필터링하고 새 객체를 만드시겠습니까?

  25. 25

    객체 배열을 필터링하고 배열에 표시되는 횟수를 기준으로 정렬하는 방법

  26. 26

    한 열의 공통 값을 기반으로 두 열 배열 필터링

  27. 27

    열의 고유 한 속성을 기반으로 배열의 데이터 행을 어떻게 비교할 수 있습니까?

  28. 28

    술어의 핵심 인 다른 배열을 기반으로 술어를 사용하여 배열 필터링

  29. 29

    SwiftUI의 ForEach에서 @Binding 배열 var를 필터링하면 필터링되지 않은 배열을 기반으로 값이 반환됩니다.

뜨겁다태그

보관