2016-09-09 2 views
0

View의 onDraw() 메소드에서 화면에 몇 개의 부동 소수점 숫자를 그릴 필요가있는 애플리케이션이 있습니다. 가비지 수집을 피하기 위해이 메서드에서 모든 할당을 제거하려고합니다. 문제는 지정된 소수 자릿수로 화면에 수레를 그려야하고 String.format()없이 문자열을 사용하지 않고 정보를 찾을 수 없다는 것입니다. float에서 char [] 로의 간단한 변환조차 문자열과 메모리 할당 없이는 문제가되는 것처럼 보입니다.Java에서 float에서 char []로 변환

그래서이 문제를 어떻게 관리해야합니까?

P. 사용자 터치 이벤트 (예 : 스크롤) 중에 숫자가 변경 될 수 있으므로 onDraw() 메서드보다 먼저 변환 할 방법이 없습니다.

+0

은'문자는 []'숫자 또는 무엇을 포함 하는가? – Midnightas

+0

처음에는 아무것도 포함되어 있지 않습니다. drawText() 메서드에서이 char 배열을 사용하려면 내 번호를 char []로 변환해야합니다. 문자열과는 달리 char []은 미리 초기화 될 수 있습니다. – Bashalex

+0

당신은 마술처럼 수레를 문자로 변환 할 수 없다는 것을 알고 있습니다. 그리고 이것 주위에 만들 수있는 무엇이든이 문자열을 사용하는 것과 거의 같을까요? – Silverclaw

답변

2

독자적인 포맷터를 구현하십시오. 다음은 단순화 된 포맷터의 예입니다.

끝에서부터 버퍼를 채우고 시작 인덱스를 반환합니다. float가 버퍼에 비해 너무 큰 경우에는 ArrayIndexOutOfBoundsException으로 실패하고 음수 값, 무한대 및 NaN은 처리하지 않습니다. 나는 너에게 맡길거야.

버퍼가 처음부터 채워져 있어야하는 경우 System.arraycopy()을 사용하여 문자를 이동하십시오.

보시다시피, 유일한 할당은 char 버퍼입니다.

public static int format(char[] buffer, float value, int decimals) { 
    float v = value; 
    for (int i = 0; i < decimals; i++) 
     v *= 10f; 
    int num = Math.round(v); 
    int idx = buffer.length; 
    for (int i = 0; i < decimals; i++, num /= 10) 
     buffer[--idx] = (char) ('0' + num % 10); 
    if (decimals > 0) 
     buffer[--idx] = '.'; 
    do { 
     buffer[--idx] = (char) ('0' + num % 10); 
    } while ((num /= 10) != 0); 
    return idx; 
} 

테스트

char[] buffer = new char[10]; 
int startIdx = format(buffer, (float)Math.PI, 4); 
for (int i = startIdx; i < buffer.length; i++) 
    System.out.print(buffer[i]); 
System.out.println(); 

출력

3.1416 
+0

감사합니다. 감사합니다. – Bashalex

관련 문제