2014-10-02 102 views
0

我有超過1000個名稱的文件,它還包括性別以及有多少人擁有該名稱。如何打印來自增強for循環的前10行

例如

薩拉˚F2000

我試圖打印從創建的第10行我的循環,但由於某種原因,我的嘗試只打印最後一行10倍。

import java.util.*; 
import java.io.*; 
import java.util.Collections; 
public class NameYear 
{ 
    private String year; 
    ArrayList<OneName> oneName = new ArrayList<OneName>(); 

    public NameYear(String year) 
    { 
    String line = ""; 
    String Top = ""; 
    Scanner sc = null; 
    try 
    { 
    sc = new Scanner(new File 
    ("/home/mathcs/courses/cs225/koch/names/yob"+year+".txt")); 
    } 
catch (Exception e) 
    { 
    System.out.println("Error Year should be between 1880 and 2013 not "+ year); 
    System.exit(1); 
    } 

    while(sc.hasNextLine()) 
    { 

    // read a line from the input file via sc into line 
     line = sc.nextLine(); 



     StringTokenizer stk = new StringTokenizer(line, ","); 
     String name = stk.nextToken(); 
     char sex = stk.nextToken().charAt(0); 
     int count = Integer.parseInt(stk.nextToken()); 


     OneName list = new OneName(name, sex, count); 

     oneName.add(list);  
    } 
    for (int i = 0 ; i < 10; i++) 
    { 
    System.out.println(descending()); 
    } 

public String descending() 
{ 
    String x = ""; 
    Collections.sort(oneName, new OneNameCountCompare()); 
    for(OneName b: oneName) 
    { 
     x = b.toString(); 
    } 
    return x; 

OneName文件

public class OneName 
{ 
private String Name; 
private char Sex; 
private int Count; 

public OneName(String name, char sex, int count) 
{ 
Name = name; 
Sex = sex; 
Count = count; 

} 
public String getName() 
{ 
return Name; 
} 
public char getSex() 
{ 
return Sex; 
} 
public int getCount() 
{ 
return Count; 
} 
public void setName(String name) 
{ 
    if (name.length() < 1) 
    { 
    throw new NullPointerException("Baby name is missing"); 
    } 

    Name = name; 

} 
private char M; 
private char F; 
public void setSex(char sex) 
{ 
if(sex != M) 
{ 
    if(sex != F) 
    { 
    throw new IllegalArgumentException("Sex has to be M or F"); 
    } 
} 
Sex = sex; 

} 
public void setCount(int count) 
{ 
if(count < 0) 
    { 
    throw new IllegalArgumentException("Count cant be negative"); 
    } 

Count = count; 

} 
public String toString() 
{ 
     return String.format("%s %c %d", Name, Sex, Count); 

} 
} 

OneNameCount

import java.util.Comparator; 
import java.util.Collections; 

public class OneNameCountCompare implements Comparator<OneName> 
{ 
public int compare(OneName b1, OneName b2) 
{ 
if(b1.getCount() <b2.getCount()) 
{ 
    return 1; 
} 
else 
{ 
    return -1; 
} 
} 
} 

主程序

import java.io.*; 
import java.util.*; 

public class TopNames 
{ 
public static void main(String args[]) 
{ 
    String line = ""; // string var to hold entire line 

if (args.length < 1) 
    { 
    System.out.println("\nYou forgot to put a Year on the command line."); 
    System.exit(1); 
    }; 
String inFile = args[0]; // file name off command line 
String year = inFile; 
NameYear list = new NameYear(year); 

} 


} 
+0

首先拋出非法參數異常,而不是在NPE#OneName setname可以。 其次你爲什麼要整理它?只要顯示它,就像你想看到你輸入的前10個一樣。 – StackFlowed 2014-10-02 12:27:11

+0

用調試器瀏覽代碼並觀察會發生什麼。特別要注意你從'降序'返回的內容。 – 2014-10-02 12:28:25

+1

你的代碼亂七八糟。這是什麼原因 - System.out.println(descending()); ? – 2014-10-02 12:29:01

回答

3

您的descending函數返回一個字符串,並且總是相同的字符串(排序集合後的最後一個順序)。不管你多頻繁地調用它,如果數據沒有改變,你總是會得到相同的,最後一個字符串。

如果你想排序後的第一個10,descending需要返回包含那些10 List<String>:在印刷時

public List<String> descending() 
{ 
    List<String> x = new ArrayList<String>(10); 
    Collections.sort(oneName, new OneNameCountCompare()); 
    for(OneName b: oneName) 
    { 
     x.add(b.toString()); 
     if (x.size() == 10) // Or don't use enhanced for, use an index instead 
     { 
      break; 
     } 
    } 
    return x; 
} 

然後,更換您的for (int i = 0 ; i < 10; i++)循環:

for (String s : descending()) 
{ 
    System.out.println(s); 
} 
+0

返回x給我一個不兼容的類型 – Phihh 2014-10-02 12:38:26

+1

您是否將方法的返回類型更改爲列表? ...公開名單降序() – 2014-10-02 12:41:38

+0

也for循環打印給出不適用於表達式類型 for(String s:descending()) – Phihh 2014-10-02 12:42:00

0

你錯誤在這裏:

for (int i = 0 ; i < 10; i++) { 
    System.out.println(descending()); 
} 

public String descending() { 
    String x = ""; 
    Collections.sort(oneName, new OneNameCountCompare()); 
    for(OneName b: oneName) { 
     x = b.toString(); 
    } 
    return x; 
} 

第一個所有在你的for循環中,你沒有使用變數,這是你的計數指標。這意味着降序()方法沒有任何意識,他如何返回不同的東西?

嘗試修改的東西降序()這樣的:

public String descending(int i) { 
    String x = ""; 
    Collections.sort(oneName, new OneNameCountCompare()); 
    OneName b = oneName.get(i); 

    x = b.toString(); 

    return x; 
}