我在下面有下面的插入排序功能,之前我正在使用严格的整数数组并调用下面的函数作为排序方法。现在在下面的函数中,我想要做的是根据任意数据的文件对此函数进行排序。 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();
}
答案 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提到的方法。