Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中对文本文件进行排序和排列以对行进行分组_Java_Sorting_Text Files - Fatal编程技术网

如何在java中对文本文件进行排序和排列以对行进行分组

如何在java中对文本文件进行排序和排列以对行进行分组,java,sorting,text-files,Java,Sorting,Text Files,真的很难解决这个问题 我有一个文本文件,上面有这样的数据(17000行) 我要做的是对文本文件进行排序(使用java),这样,如果右值为1,则所有左边的数字都将分组。 或者,如果右侧不等于1,则左侧值为group(即任何其他数字)。 例如(但不一定要这样) 我知道我可能需要使用数组?还是什么?但我就是想不出来:'( 任何帮助、代码或建议-非常感谢 谢谢!我会使用地图来存储数据: Map<Integer, Set<Integer>> map = new TreeSet<

真的很难解决这个问题

我有一个文本文件,上面有这样的数据(17000行)

我要做的是对文本文件进行排序(使用java),这样,如果右值为1,则所有左边的数字都将分组。 或者,如果右侧不等于1,则左侧值为group(即任何其他数字)。 例如(但不一定要这样)

我知道我可能需要使用数组?还是什么?但我就是想不出来:'(

任何帮助、代码或建议-非常感谢


谢谢!

我会使用地图来存储数据:

Map<Integer, Set<Integer>> map = new TreeSet<Integer, Set<Integer>>();
Map Map=newtreeset();
键是第一行的值,由于它不是唯一的,所以“贴图”值是一个集合,它保存第二列中的各种值

private void addLine(String line) {
  String[] fields = line.split("\\s*");
  Integer key = Integer.parseInt(fields[0]);
  Integer value = Integer.parseInt(fields[1]);
  Set<Integer> set = map.get(value);
  if (set == null) {
     set = new HashSet<Integer>();
     map.put(key, set);
  }
  set.add(value);
}
private void addLine(字符串行){
字符串[]字段=行。拆分(\\s*);
整数键=Integer.parseInt(字段[0]);
整数值=Integer.parseInt(字段[1]);
Set=map.get(值);
if(set==null){
set=新的HashSet();
地图。放置(键,集合);
}
增加(价值);
}
读取文件后,您可以获得每个数字的结果,如下所示:

private String getResult(Integer key) {
  Set<Integer> values = map.get(key);
  if (values == null) {
     return null;  // key not in map (unknown number)
  } else if (values.size() == 1) {
     return values.iterator().next().toString();
  } else {
    return "MIXED";
  }
}
私有字符串getResult(整数键){
设置值=map.get(键);
如果(值==null){
返回null;//键不在映射中(未知编号)
}else if(values.size()==1){
返回值。迭代器().next().toString();
}否则{
返回“混合”;
}
}

我将生成两个映射,一个用于当右边为1时,另一个用于所有其他右边值。每个映射将左边值映射为出现次数的计数。然后可以通过循环数据填充映射。在伪Java中:

Map<Integer, Integer> onesMap = new HashMap<Integer, Integer>();
Map(Integer, Integer> otherMap = new HashMap<Integer, Integer>();

for (each left/right pair) {
    Map<Integer, Integer> map = right == 1 ? onesMap : otherMap;
    Integer count = map.get(left);
    map.put(left, count == null ? 1 : (1 + count));
}
Map onesMap=newhashmap();
Map(Integer,Integer>otherMap=newhashmap();
用于(每对左/右){
Map Map=right==1?onesMap:otherMap;
整数计数=map.get(左);
put(左,count==null?1:(1+count));
}
最后,键/值对为每个左值提供所需的计数。

Map map1=new HashMap();
Map<Integer, Integer> map1=new HashMap<Integer, Integer>();
Map<Integer, Integer> mapMixed=new HashMap<Integer, Integer>();

void addValues(int value, int num){
   if (num==1){
     if (map1.get(value)==null) map1.put(value,0);
     map1.put(value,map1.get(value)+1);
   } else {
     if (mapMixed.get(value)==null) mapMixed.put(value,0);
     mapMixed.put(value,mapMixed.get(value)+1);
   }
}
Map mapMixed=新HashMap(); void addValues(int值,int num){ 如果(num==1){ 如果(map1.get(value)==null)map1.put(value,0); map1.put(值,map1.get(值)+1); }否则{ 如果(mapMixed.get(value)==null)mapMixed.put(value,0); mapMixed.put(值,mapMixed.get(值)+1); } }
之后,您必须打印地图:

void printIt(){
   Set<Integer> keys=map1.keySet();
   keys.AddAll(mapMixed.keySet());
   for (int key:keys){
       if (map1.get(key)!=null) println(map1.get(key)+"x"+key+" 1");
       if (mapMixed.get(key)!=null) println(mapMixed.get(key)+"x"+key+" MIXED"); 
   }

}
void printIt(){
Set keys=map1.keySet();
AddAll(mapMixed.keySet());
for(int键:键){
如果(map1.get(key)!=null)println(map1.get(key)+“x”+key+“1”);
如果(mapMixed.get(key)!=null)println(mapMixed.get(key)+“x”+key+“MIXED”);
}
}
我的代码:

public class Sort {


private static class Counter {

    private int one;
    private int mixed;

    public void incrementOne() {
        one++;
    }

    public void incrementMixed() {
        mixed++;
    }
}

public static void main(String[] args) throws IOException {
    Map<String, Counter> map = new LinkedHashMap<String, Counter>();
    String fileName = "input.txt";
    BufferedReader reader = new BufferedReader(new FileReader(fileName));

    for (String line = reader.readLine(); line != null; line = reader.readLine()) {
        StringTokenizer tokenizer = new StringTokenizer(line);
        String key = tokenizer.nextToken();
        String value = tokenizer.nextToken();
        Counter counter = map.get(key);
        if (counter == null) {
            counter = new Counter();
            map.put(key, counter);
        }
        if (value.equals("1")) {
            counter.incrementOne();
        } else {
            counter.incrementMixed();
        }
    }
    reader.close();
    BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"));
    for(Map.Entry<String, Counter>entry:map.entrySet()){
        Counter counter = entry.getValue();
        if(counter.one>0){
            writer.write(String.valueOf(counter.one));
            writer.write(" x ");
            writer.write(entry.getKey());
            writer.write("   1");
            writer.newLine();
        }
        if(counter.mixed>0){
            writer.write(String.valueOf(counter.mixed));
            writer.write(" x ");
            writer.write(entry.getKey());
            writer.write("   MIXED");
            writer.newLine();
        }
    }
    writer.close();

}
公共类排序{
专用静态类计数器{
私人int one;
私人机构;
公共void incrementOne(){
1++;
}
public void incrementMixed(){
混合++;
}
}
公共静态void main(字符串[]args)引发IOException{
Map Map=newlinkedhashmap();
字符串fileName=“input.txt”;
BufferedReader reader=新的BufferedReader(新文件读取器(文件名));
for(String line=reader.readLine();line!=null;line=reader.readLine()){
StringTokenizer标记器=新的StringTokenizer(行);
String key=tokenizer.nextToken();
String value=tokenizer.nextToken();
计数器=map.get(键);
if(计数器==null){
计数器=新计数器();
地图放置(钥匙、计数器);
}
如果(值等于(“1”)){
counter.incrementOne();
}否则{
counter.incrementMixed();
}
}
reader.close();
BufferedWriter=newbufferedwriter(newfilewriter(“output.txt”);
for(Map.Entryentry:Map.entrySet()){
计数器计数器=entry.getValue();
如果(计数器1>0){
writer.write(String.valueOf(counter.one));
作者:写(“x”);
writer.write(entry.getKey());
作者:写(“1”);
writer.newLine();
}
如果(计数器混合>0){
writer.write(String.valueOf(counter.mixed));
作者:写(“x”);
writer.write(entry.getKey());
作家。写(“混合”);
writer.newLine();
}
}
writer.close();
}

}

我建议您使用两个实例,一个用于“混合”值,另一个用于“1”值。毕竟,您只需要计算值的数量,而这正是
Multiset
所提供的

所以你会使用类似于:

final Multiset<Integer> mixed = new HashMultiset<Integer>();
final Multiset<Integer> one = new HashMultiset<Integer>();

Files.readLines(new File(...), Charsets.UTF8,

    new LineProcessor<Void>() {
      @Override Void getResult() { return null; }

      @Override void processLine(String line) {
          // TODO: Split line into two integers
          int value = ...;
          int type = ...;

          Multiset<Integer> set = type == 1 ? one : mixed;
          set.add(value);
      }
    });
final Multiset mixed=new HashMultiset();
final Multiset one=新HashMultiset();
Files.readLines(新文件(…)、Charsets.UTF8、,
新的LineProcessor(){
@重写Void getResult(){return null;}
@重写无效进程行(字符串行){
//TODO:将行拆分为两个整数
int值=。。。;
int类型=。。。;
多集集合=类型==1?一:混合;
增加(价值);
}
});

然后,您可以迭代这两个集合,并找到每个条目的值和计数。

您必须从所有文件还是从序列进行分组?即:45226 1;45227 1;45226 1;必须是2x45226 1;1x452727 1或1x452261;1x452727 1;1x452266 1?对不起,我看到了:)从整个文件来看,2X452226 1;1x455227 1是正确的方法
public class Sort {


private static class Counter {

    private int one;
    private int mixed;

    public void incrementOne() {
        one++;
    }

    public void incrementMixed() {
        mixed++;
    }
}

public static void main(String[] args) throws IOException {
    Map<String, Counter> map = new LinkedHashMap<String, Counter>();
    String fileName = "input.txt";
    BufferedReader reader = new BufferedReader(new FileReader(fileName));

    for (String line = reader.readLine(); line != null; line = reader.readLine()) {
        StringTokenizer tokenizer = new StringTokenizer(line);
        String key = tokenizer.nextToken();
        String value = tokenizer.nextToken();
        Counter counter = map.get(key);
        if (counter == null) {
            counter = new Counter();
            map.put(key, counter);
        }
        if (value.equals("1")) {
            counter.incrementOne();
        } else {
            counter.incrementMixed();
        }
    }
    reader.close();
    BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"));
    for(Map.Entry<String, Counter>entry:map.entrySet()){
        Counter counter = entry.getValue();
        if(counter.one>0){
            writer.write(String.valueOf(counter.one));
            writer.write(" x ");
            writer.write(entry.getKey());
            writer.write("   1");
            writer.newLine();
        }
        if(counter.mixed>0){
            writer.write(String.valueOf(counter.mixed));
            writer.write(" x ");
            writer.write(entry.getKey());
            writer.write("   MIXED");
            writer.newLine();
        }
    }
    writer.close();

}
final Multiset<Integer> mixed = new HashMultiset<Integer>();
final Multiset<Integer> one = new HashMultiset<Integer>();

Files.readLines(new File(...), Charsets.UTF8,

    new LineProcessor<Void>() {
      @Override Void getResult() { return null; }

      @Override void processLine(String line) {
          // TODO: Split line into two integers
          int value = ...;
          int type = ...;

          Multiset<Integer> set = type == 1 ? one : mixed;
          set.add(value);
      }
    });