java - 二维数组排序

标签 java arrays sorting

我有一个文本文件,它被读入列表然后转换为数组。在文本文件中,每一行都是二维数组的一个元素。但是,从文本文件到数组的转换使元素的顺序不正确,与文件的顺序不同。

这是迄今为止我的代码:

import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.*;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

/**
* @(#)ReadFromFile.java
*
*
* @author 
* @version 1.00 2016/2/25
*/

public class ReadFromFile {

  public static String[] readFile(String path){
    try{
      int i = 0;
      int length = Files.readAllLines(Paths.get(path)).size();
      String[] results = new String[length];
      for(String line : Files.readAllLines(Paths.get(path))){
        results[i++] = line;
      }
      return results;
    } catch(IOException e) {
      e.printStackTrace();
      return null;
    }
  }

  public static void main(String[] args) {
    // Operation for Prescription File
    String[] lines = readFile("prescription.txt");
    String[] array = new String[7];
    ArrayList<String> mylist = new ArrayList<String>();
    for(String line : lines){
        for (String s : line.split("    ")){
        mylist.add(s);
        }
    }
    String[] pre = mylist.toArray(array);// Stores the elements in     prescription txt
    System.out.println(Arrays.toString(pre));
    // Operation for medicament file`enter code here`
    String[] lines2 = readFile("medicaments.txt");
    ArrayList<String> mylist2 =`enter code here` new ArrayList<String>();
    int count = 0;// varıable for countıng lines of medicaments file
    for(String line2 : lines2){
        count++;
        for (String s : line2.split("   ")){
        mylist2.add(s);
        }
   }
    String[] array2 = new String[count * 5];
    String[] med = mylist2.toArray(array2);// Stores the elements in   prescription txt
    //Converting (medicaments.txt) 1d array into 2d array
   String array2d[][] = new String[count][5];

    for(int i=0; i<count;i++){
       for(int j=0;j<5;j++){
          array2d[i][j] = med[(j*count) + i];
       }
    }
    System.out.println(Arrays.deepToString(array2d));
    // Initialize array variables to compare
    String medicine1 = pre[3];
    String medicine2 = pre[5];
    String numOfmedicine1 = pre[4];
    String numOfmedicine2 = pre[6];
    String socSecurity = pre[1];
    String date = pre[1];
  }
}

这是我的文本文档:

aspirin ssk 01.01.2016  31.01.2016  5.5
aspirin ssk 01.01.2016  31.01.2016  4
aspirin es  01.01.2016  31.01.2016  5.4
aspirin bk  01.01.2016  31.01.2016  6.1
aspirin ssk 01.01.2016  31.01.2016  5.4
novalgin    ssk 01.01.2016  31.01.2016  8.3

每行中的输出元素以不同的顺序出现:

[[aspirin, ssk, 01.01.2016, 31.01.2016, 5.4], [ssk, 01.01.2016, 31.01.2016, 6.1, novalgin], [01.01.2016, 31.01.2016, 5.4, aspirin, ssk], [31.01.2016, 4, aspirin, ssk, 01.01.2016], [5.5, aspirin, bk, 01.01.2016, 31.01.2016], [aspirin, es, 01.01.2016, 31.01.2016, 8.3]]

如何纠正这个问题?

最佳答案

首先,你把事情想得太复杂了。您的整个readFile函数不必要地转换 List<String>到一个字符串数组,仅供您将其转换回来。你的类(class)应该使用 Files.readAllLines() 直接,避免直接使用数组,而是使用完整列表选项,如下所示:

import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.*;
import java.io.IOException;

public class ReadFromFile {

  public static List<String> getWords(String path) {
    try {
      List<String> lines = Files.readAllLines(Paths.get(path));
      List<String> words = new ArrayList<>();  //Use descriptive variable names!
      for (String line : lines) {
        for (String word : line.split("    ")) {
          words.add(word);
          System.out.println(word);
        }
      }
      return words;
    } catch (IOException e) {
      //handle exception
      return null;  //This is not advised
    }
  }

  public static void main(String[] args) {
    List<String> prescription_words = getWords("prescription.txt");
    List<String> medicaments_words = getWords("medicaments.txt");

    List<List<String>> list2d = new ArrayList();

    for (int idx=0; idx < medicaments_words.size(); idx++) {
      // Iterate through your medications and add them to your 2dArray
    }
  }
}

现在,这并没有解决两件事。首先,您的原始代码有两个文本文件,仅指定了其中一个(哪个?)。其次,您不清楚转换实际上应该如何发生:

for(int i=0; i<count;i++){
   for(int j=0;j<5;j++){
      array2d[i][j] = med[(j*count) + i];
   }
}

您不清楚(主要是因为 countij 是不好使用的变量)您想要什么结果。这更具可读性:

for(int row=0; row < number_of_meds; row++){
   for(int column=0; column < 5; column++){
      index_of_medication = (column * number_of_meds) + row
      array2d[row][column] = med[index_of_medication];
   }
}

但是这种表达方式有点奇怪。您真正想做的是迭代您的药物并将它们放入二维数组中。您所要做的就是先设置外部数组,然后向每个内部数组添加元素。

关于java - 二维数组排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35685693/

相关文章:

java - 在某个值之后搜索列表中的最小元素

java - While 循环不继续 - 套接字

java - 带参数的工厂模式

JavaScript 数组indexOf()方法不起作用

c++ - 如何检查空行?

java - 根据每个字符串的子字符串对 String ArrayList 的一半进行排序

java - eclipse checkstyle 错误无法初始化模块 TreeWalker - TreeWalker 不允许作为 FileLength 的父级

java - Kotlin 数据类打包

arrays - 如何遍历 perl 常量

javascript - JavaScript 中反转数组的代码失败