插入文件的排序

时间:2017-03-24 13:25:49

标签: java

我在下面有下面的插入排序功能,之前我正在使用严格的整数数组并调用下面的函数作为排序方法。现在在下面的函数中,我想要做的是根据任意数据的文件对此函数进行排序。 AM不完全确定如何处理这个问题。我尝试编写函数并在函数中包含文件路径,但我猜这不完全正确。关于如何正确处理这个问题的任何建议?

<div class="table-responsive">
    <table id="dataTable" class="table table-striped table-bordered dt-responsive nowrap" cellspacing="0" style="width: 100%;">
        <thead>
            <tr>
                <th>
                    @Html.ActionLink("Last Name", "Index", new { sortOrder = ViewBag.NameSortParm, currentFilter = ViewBag.CurrentFilter })
                </th>
                <th>
                    First Name
                </th>
                <th>
                    @Html.ActionLink("Enrollment Date", "Index", new { sortOrder = ViewBag.DateSortParm, currentFilter = ViewBag.CurrentFilter })
                </th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model)
            {
                <tr>
                    <td>
                        @Html.DisplayFor(modelItem => item.LastName)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.FirstMidName)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.EnrollmentDate)
                    </td>                    
                    <td>
                        @Html.ActionLink("Details", "Details", new { id = item.ID })
                        @if (User.IsInRole("Admin"))
                        {
                            @:|
                            @Html.ActionLink("Edit", "Edit", new { id = item.ID })@: |

                            @Html.ActionLink("Delete", "Delete", new { id = item.ID })
                        }
                        else
                        {
                        }
                    </td>
                </tr>
            }
        </tbody>
    </table>
</div>

更新代码:

public static void InsertionSort(int filename[], int size) {
    int index, count;
int temp;
index = 1;
Scanner sca = null;
try {
    sca = new Scanner(new File(
            "C:/Users/Frank/Downloads/wb1913_samp1040.txt"));
    while (sca.hasNextLine()) {
        while (index < size) {
            temp = filename[index];
            count = index;
            while (count >= 0 && temp <= filename[count - 1]) {
                filename[count] = filename[count - 1];
                --count;
            }
            filename[count] = temp;
            index++;
        }
    }
} catch (FileNotFoundException exception) {

} finally {
    sca.close();

}

4 个答案:

答案 0 :(得分:2)

获得String后可以使用以下排序方法

public static String[] dictionaryFormString(String[] s)
{
    //
    // Sort each individual string element by alphabetical order
    //
    for (int i = 0; i < s.length; i++)
    {
        String wordSt = s[i];
        if(wordSt == null) continue;

        char[] word = wordSt.toCharArray();
        Arrays.sort(word);
        s[i] = new String(word);
    }
    return s;
}

答案 1 :(得分:2)

我在这里假设你正在挑战自己(或有人挑战过你)写一个你自己的插入类型,并且你想在从文件中读取它时插入每个元素。

如果您只是想读取一个文件并最终得到一个已排序的数组,那么只是将它无序地插入到数组中会更简单,更有效,然后使用Arrays.sort()。除了学习练习外,程序员现在很少编写排序算法。

您可以通过将程序分解为更多方法来使您的程序更容易理解 - 每个方法都做得更少,因此更容易理解,但将它们放在一起它们是强大的。

所以:

private void readIntoSortedArray(Scanner sca, String[] array) {
    while (sca.hasNextLine()) {
        insertInto(array, sca.nextLine());
    }
}

private void insertInto(String[] array, String line) {
    int index = findFirstElementGreaterThan(line);
    shiftElementsByOne(array, index);
    array[index] = line;
}

......等等。在这里,我给你了你的方法链的“中间”。您需要在堆栈中编写更高的方法,准备Scanner并调用readIntoSortedArray。您需要编写insertInto()调用的方法。也许那些会召唤更多方法。

这也意味着您可以编写小程序来驱动这些子方法,并检查它们是否按预期工作。

 String[] testArray = new String[]{"Adam", "Brian", "Dave"};
 int index = findFirstElementGreaterThan("Clive");
 if(index != 2) {
     throw new RuntimeException("Index should be 2 - was " + index);
 }

这距离测试驱动的开发只有很短的一步,这在学习早期采用是一件好事,因为它使事情变得更容易。 ( JUnit 是一个非常流行的工具,基本上做同样的事情,更好)。

如果你做完这个,你觉得你的程序有太多微小的方法,你可以随时“内联”你的子方法 - 但很多人觉得方法的正确大小绝对很小

我想你想要按字母顺序排序。您无法将字符串与<>进行比较 - 您可以使用string1.compareTo(string2)(还有其他更灵活的方式,但现在可以了。)

答案 2 :(得分:1)

如果您的文件包含字符串,并且您想对其进行排序。 一种方法可能是在读取文件后创建一个字符串数组(假设它不是很大的文件),然后应用排序。

// Read from file
String[] words = someFunctionThatReadFileAndReturnArrayOfString(file);

Arrays.sort(words); // or your sorting function

for (String word : words)
{
   System.out.println(word);
}

如果您希望insertionSort函数更通用,以便它与数据类型无关,那么您可以向用户请求Comparable对象作为函数的附加参数,并将其用于比较代码中的对象。

您的方法签名将是这样的 -

public static void InsertionSort(Object list[],Comparator<Object> compare)

答案 3 :(得分:1)

public static boolean doesKeyStringOccursEarlyInDict(String string,String key){
    int i = Math.min(string.length(), key.length());
    int j = 0;
    while(j<i){
        if(string.charAt(j) > key.charAt(j)){
            return true;
        }
        j++;
    }
    //else return false as either both were equal or key does not come early in dictionary
    return false;
}

public static void insertionSort(String[] s){
    for(int i=1;i<s.length;i++){
        String key = s[i];
        int j = i-1;
        while(j>=0 && doesKeyStringOccursEarlyInDict(s[j], key)){
            s[j+1] = s[j];
            j--;
        }
        s[j+1]=key;
    }
}
public static void main(String[] args) {
    //read the file each line
    //split it and store it in an arraylist of string as it can grow..repeat it till u have read all the content 
 ArrayList<String> s = new ArrayList<>();
    //get the complete string array
    String[] stringarr = (String[]) s.toArray();
    //example : String[] stringarr = {"def","xyz","abc","aaa"};
    insertionSort(stringarr);
    for(String words:stringarr)
    System.out.println(words);
}

上面我已经给出了你正在寻找的部分。你已经能够读取文件。所以只需填写上面代码中的空白即可。 此外,我并没有试图挑战你,而是鼓励先思考然后问。 在纳入上述内容后,我建议您遵循Slim和Nishanth提到的方法。