2011-04-27 5 views
-1
public class kmeansgeneral { 
    public static void main(final String args[]) throws Exception { 

     int words = 0; 
     int chars = 0; 
     int lines = 0; 

     String s, sp1; 
     StringTokenizer st; 
     final ArrayList<Double> x = new ArrayList<Double>(); 

     final FileReader fr = new FileReader("G:/t1.txt"); 
     final BufferedReader buf = new BufferedReader(fr); 

     // Counting number of words and lines 
     while ((s = buf.readLine()) != null) { 
      lines++; 
      st = new StringTokenizer(s, " ,;:."); 

      while (st.hasMoreTokens()) { 

       words++; 
       s = st.nextToken(); 
       chars += s.length(); 

       final Double y = new Double(s); 
       x.add(y); 

      } 

     } 

     System.out.println("Word Count : " + words/lines); 
     System.out.println("Line Count : " + lines); 
     // Counting and printing number of words and lines ENDS 

     Double ct[] = new Double[0]; 
     ct = x.toArray(ct); 

     // Input array, values to be read in successively, float 
     // double[][] indat = new double[lines][lines*words]; 
     final double[][] indat = new double[10][10]; 
     int inval = 0; 

     final BufferedReader buf1 = new BufferedReader(new InputStreamReader(System.in)); 
     System.out.print("Enter K-Value : "); 
     sp1 = buf1.readLine(); 

     final Integer ky = new Integer(sp1); 
     final int k = ky; 

     System.out.println("K == " + k); 

     // Now read in input array values, successively 

     for (int i = 0; i < lines; i++) { 
      for (int j = 0; j < words/lines; j++) { 

       indat[i][j] = ct[inval]; 
       inval++; 

       System.out.print(indat[i][j]); 
       System.out.print("\t"); 
      } 
      System.out.println(); 
     } 


     // Initial Clusters 
     System.out.println(" "); 
     System.out.println(k + " seed points "); 

     final double[][] Clusters = new double[k][lines * words]; 
     // double[][] calcnt = new double[lines][words]; 
     final double[][] calcnt = new double[1000][1000]; 
     final double[][] array = new double[k][lines * words]; 

     System.out.println("Clusters==>"); 
     // int pos=0; 
     for (int i = 0; i < k; i++) { 
      for (int j = 0; j < words/lines; j++) { 

       Clusters[i][j] = indat[i][j]; 
       // pos= j; 

       System.out.print(Clusters[i][j]); 
       System.out.print("\t"); 
      } 
      System.out.println(); 

     } 
     System.out.println("PRINTING VECTOR ELEMENTS:"); 
     final Vector FinalClusters[][] = new Vector[100][100]; 

     for (int i = 0; i < k; i++) { 
      for (int j = 0; j < words/lines; j++) { 
       final String tempString = String.valueOf(Clusters[i][j]); 
       FinalClusters[i][j].add(tempString); 
      } 

     } 

     // Inital Cluster Array 
     System.out.println("Initial Cluster Array"); 
     int b = 0; 
     final double[] arr = new double[2000]; 

     for (int i = 0; i < k; i++) { 
      for (int j = 0; j < words/lines; j++) { 

       arr[b] = Clusters[i][j]; // = indat[i][j]; 
       System.out.print(arr[b]); 
       System.out.print("\t"); 
       b++; 
      } 

     } 
     System.out.println(); 


     System.out.println("Centroids"); 

     for (int i = 0; i < k; i++) { 
      for (int j = 0; j < words/lines; j++) { 

       calcnt[i][j] = (Clusters[i][j] + indat[k][j])/2; 

       System.out.print(calcnt[i][j]); 
       System.out.print("\t"); 

      } 

     } 

     // Claculate Distances 

     // System.out.println("MAGIC# 3"); 

     final double[] dist = new double[k]; 

     for (int i = 0; i < k; i++) { 

      double dis = 0; 
      for (int j = 0; j < words/lines; j++) { 

       dis = dis + (Math.pow(Clusters[i][j] - indat[k][j], 2)); 

      } 
      dist[i] = (Math.sqrt(dis)); 
      System.out.println("From Cluster K = " + i + "\t" + "Distance" + dist[i]); 
     } 

     System.out.println("To Find Minimum Distance "); 

     double min = dist[0]; 

     int y = 0; 

     for (int m = 0; m < k; m++) { 

      if (dist[m] < min) { 
       min = dist[m]; 
       y = m; 
      } 
     } 
     System.out.print("Min Value =" + min + "\t" + "For Cluster :" + y); 

     System.out.println(); 
     System.out.print("Added Cluster ="); 
     final double[] temp = new double[lines * (words/lines)]; 

     for (int j = 0; j < words/lines; j++) { 

      temp[j] = indat[k][j]; 

      System.out.print(temp[j]); 
      System.out.print("\t"); 

     } 
     System.out.println(); 

     final Vector[] vector = new Vector[k]; 
     for (int i = 0; i < k; i++) { 
      vector[i] = new Vector<Object>(); 
     } 

     for (int i = 0; i < words/lines; i++) { 
      vector[y].add(String.valueOf(temp[i])); 
     } 

     System.out.println(Arrays.toString(vector)); 


    } 
} 
+4

올바른 코드 형식을 지정하고 NPE의 스택 추적을 표시하십시오. –

+0

코드 라인에 –

+0

rofl, k- 수단을 코딩하지만 그가 어디에서 NPE를 얻는 지 알지 못합니다. –

답변

2

에서 nullpointer을 때렸어 :

t1.txt :

123 
234 
345 
34456 

출력 :

Word Count : 1 
Line Count : 4 
Enter K-Value : 3 
K == 3 
123.0 
234.0 
345.0 
34456.0 

3 seed points 
Clusters==> 
123.0 
234.0 
345.0 
PRINTING VECTOR ELEMENTS: 
Exception in thread "main" java.lang.NullPointerException 
    at test.kmeansgeneral.main(kmeansgeneral.java:106) 

이 코드는 다음과 같습니다.

System.out.println("PRINTING VECTOR ELEMENTS:"); 
final Vector FinalClusters[][] = new Vector[100][100]; 

for (int i = 0; i < k; i++) { 
    for (int j = 0; j < words/lines; j++) { 
     final String tempString = String.valueOf(Clusters[i][j]); 
     // NPE OCCURS IN THE LINE BELOW 
     FinalClusters[i][j].add(tempString); 
    } 
} 

문제는 배열 'FinalClusters'에 빈 값이 아닌 null 값이 포함되어 있습니다. 그래서 여기에 수정이의, 선 위에 다음 줄을 추가 오류가 발생하는 위치 :

if (FinalClusters[i][j] == null) { 
    FinalClusters[i][j] = new Vector(); 
} 

그런 다음 출력은 다음과 같습니다

Word Count : 1 
Line Count : 4 
Enter K-Value : 3 
K == 3 
123.0 
234.0 
345.0 
34456.0 

3 seed points 
Clusters==> 
123.0 
234.0 
345.0 
PRINTING VECTOR ELEMENTS: 
Initial Cluster Array 
123.0 234.0 345.0 
Centroids 
17289.5 17345.0 17400.5 From Cluster K = 0 Distance34333.0 
From Cluster K = 1 Distance34222.0 
From Cluster K = 2 Distance34111.0 
To Find Minimum Distance 
Min Value =34111.0 For Cluster :2 
Added Cluster =34456.0 
[[], [], [34456.0]] 

나는 이것이 어떻게해야 무슨 단서가없는, 이것이 옳은지 알 수 없습니다. 적어도 예외는 더 이상 발생하지 않습니다.

+0

감사합니다.이 도움이되었습니다 ... 그리고 이것은 내 첫 번째 질문이었습니다 ... 그래서 , 나는 내가 정말로 문구에 관한 howw를 정말로 didnt한다라고 생각한다. .. 나의 긍정 (그것이 나의 비상 경계 태울과 조우했던 지역이었다). – wave5459

2

먼저 문제를 명확하게하기 위해 게시물을 redit해야합니다.

그런 다음 관련없는 코드를 모두 제거하십시오.

그런 다음 stacktrace를 보면 어떤 줄이 잘못되었는지, 그 줄을 게시해야하는지 알려줍니다. 그것은 당신의 오류가 어레이 initiliase했던 것입니다 다음의 경우

 FinalClusters[i][j].add(tempString);//is it this line ? 
     // where did you initialise FinalClusters[i][j] ?? 
     // maybe you first need FinalClusters[i][j] = new Vector(); 

:

나는 내가 그에게 줄을 가정 그와 하나가 ** 그렇지 않으면 코드가 너무

컴파일되지 것 같아요 배열의 개별 요소는 아닙니다.

사이드 노트 : 정말 벡터 배열이 필요합니까?

+0

감사합니다 !! 다음 번에 내 질문을 더 명확하게 게시 할 것입니다! 이것은 나의 처음 여기의 시간이었다. 그리고 예, 나는 매번 같은 정적 텍스트 파일을 사용할 생각이 없기 때문에 벡터 배열이 필요합니다. – wave5459

0

추측 해 보겠습니다.이 코드를 Eclipse 또는 jvm에 콘솔을 사용할 수없는 일부 편집기에서 디버깅하는 중 오류가 발생했을 수 있습니다. 이 경우 다음의 경우

당신은 아마 나는 다음과 같은 입력 파일에 대한 코드를 실행 sp1 = buf1.readLine();

관련 문제