2014-10-02 45 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; 
}