저는 지역 대학의 2 학년 학생이고 현재 컴퓨터 프로그래밍 수업을 듣고 있습니다. 일반적으로 문제가 발생하지만 프로그래밍 수업에서 꽤 잘합니다. 우리 교수는 또 다른 진단 테스트로 완료하기를 원하는 불완전한 알고리즘을 제공했습니다. 그는 바로 가기를 사용하지 않고해야한다고 미리 말씀 드렸습니다. 즉, 비교기를 사용할 수없고 버블, 삽입, 선택 및 병합 정렬과 같은 기본 정렬 알고리즘 만 사용할 수 있으며 이진 또는 선형 검색 만 사용할 수 있습니다.
학생과 점수를 분류하도록 설계된 불완전한 파일을 받았습니다. 내가 생각 해낸 특별한 문제는 정렬 알고리즘과 내가 만들어야하는 검색 알고리즘입니다. 강사는 알고리즘이 작동하는지 확인하기 위해 몇 가지 테스트 자료를 제공했습니다. 놀랍게도 저는 그렇지 않았습니다. 모든 유형의 정렬 알고리즘을 시도했지만 어떤 이유로 알고리즘이 실패했다고 테스트했습니다. 이 곤경을 어떻게 해결해야합니까?
운영체제 : windows 7, Java Workbench : Eclipse
다음은 알고리즘 코드입니다. 아주 지저분 해 보이면 사과드립니다. 이것은 현재 정렬 algorihtm입니다. (제 교수의) 설계는 배열이 내림차순으로 정렬된다는 것입니다.
public static void sort(Student[] students) {
if(students == null)
return;
for(int i=0;i<students.length-2;i++){
Student temp = students[i];
for(int k=i+1;k<students.length-1;k++){
Student temp2= students[k];
int result = temp2.compareTo(temp);
if(result > 0){
students[k] = temp;
students[i] = temp2;
}
}
}
}
다음은 검색 알고리즘에 대한 코드입니다. 다시 말하지만, "name"이라는 문자열을 사용하여 학생의 이름과 성을 검색 할 수 있도록 설계되었습니다. 알고리즘은 "lastname firstname"및 "firstname lastname"과 같은 이름의 서식을 무시하고 대문자를 무시하는 방식으로 만들어집니다. 다시 한 번 지저분한 일에 대해 사과하십시오.
public static int search(Student[] students, String name) {
if(students == null || students.length == 0)
return -1;
for(int i=0;i<students.length;i++){
name.toLowerCase();
if(name.compareTo(students[i].getGivenName().toLowerCase()+" "+students[i].getFamilyName().toLowerCase()) == 0 || name.compareTo(students[i].getFamilyName().toLowerCase()+" "+students[i].getGivenName().toLowerCase()) == 0)
return 1;
}
return -1;
}
그래서 결국, 당신이 끝까지 건너 뛴 경우에, 내 질문은 : 내가 내 정렬 알고리즘에서 무엇을 잘못했는지, 그리고 여전히 제대로 작동하면서 검색 알고리즘을 단축하는 더 좋고 간단한 방법이 있습니까?
편집 : 여기에 각각 정렬 및 검색 알고리즘에 대한 테스트 알고리즘이 있습니다. 테스트 정렬 알고리즘은 내가 만든 정렬 알고리즘을 따를 수 있지만 어떤 이유로 교수가 만든 부울 조건을 통과하지 못합니다.
public void testSort() throws OutOfRangeException, FileNotFoundException {
Student[] students = new Student[6];
students[0] = new Student("joey", "mitchel", new int[]{42,51,64,70,81});
students[1] = new Student("Sandy", "luchel", new int[]{64,51,64,70,81});
students[2] = new Student("Sandy", "luchel", new int[]{42,51,64,70,81});
students[3] = new Student("amanda", "jones", new int[]{95,51,64,70,81});
students[4] = new Student("Susane", "Louis", new int[]{42,51,64,70,81});
students[5] = new Student("Samuel", "jones", new int[]{95,51,64,70,81});
StudentSearcherSorter.sort(students);
for(int i=0; i<students.length - 1; i++) {
boolean b1 = students[i].total() > students[i+1].total();
boolean b2 = false;
boolean b3 = false;
if(b1 == false && students[i].total() == students[i+1].total())
b2 = students[i].getFamilyName().compareTo(students[i+1].getFamilyName()) < 0;
if(b2 == false && students[i].total() == students[i+1].total() && students[i].getFamilyName().compareTo(students[i+1].getFamilyName()) == 0)
b3 = students[i].getGivenName().compareTo(students[i+1].getGivenName()) < 0;
assertTrue(b1 || b2 || b3);
}
}
및 검색 테스트 알고리즘. 일반적으로 검색 알고리즘에 대한 코드를 처리하는 방식과 관련이있을 수 있지만 무엇이 잘못되었는지 잘 모르겠습니다.
public void testSearch() throws FileNotFoundException, OutOfRangeException {
Student[] students = new Student[6];
students[0] = new Student("joey", "mitchel", new int[]{42,51,64,70,81});
students[1] = new Student("Sandy", "luchel", new int[]{64,51,64,70,81});
students[2] = new Student("Sandy", "luchel", new int[]{42,51,64,70,81});
students[3] = new Student("amanda", "jones", new int[]{95,51,64,70,81});
students[4] = new Student("Susane", "Louis", new int[]{42,51,64,70,81});
students[5] = new Student("Samuel", "jones", new int[]{95,51,64,70,81});
for(int i=0; i<students.length; i++) {
assertTrue(StudentSearcherSorter.search(students, students[i].getGivenName().toUpperCase()+" "+students[i].getFamilyName()) >= 0);
assertTrue(StudentSearcherSorter.search(students, students[i].getFamilyName()+" "+students[i].getGivenName().toUpperCase()) >= 0);
}
}
정렬에 대해서는 원래 버전에서 코드가 students
배열 의 마지막 두 요소를 비교하지 않습니다 .
public static void sort(Student[] students) {
if(students == null)
return;
루프의 상한은이어야 students.length - 1
하므로의 마지막 값은 i
입니다 students.length - 2
.
// for(int i=0;i<students.length-2;i++){
for(int i=0;i<students.length-1;i++){
Student temp = students[i];
마찬가지로이 루프의 상한은이어야 students.length
하므로의 마지막 값은 k
입니다 stidents.length - 1
. 또한, 두 경우 모두 교체 할 수 있습니다 <
로 <=
.
// for(int k=i+1;k<students.length-1;k++){
for(int k=i+1;k<students.length;k++){
Student temp2= students[k];
int result = temp2.compareTo(temp);
if(result > 0){
students[k] = temp;
students[i] = temp2;
}
}
}
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다