Code Sorted map bị sai

—Đây là phương thức add vị trí vào từng phần tử

public void add(String word, int position) throws FileNotFoundException {
	if (map.containsKey(word)) {
		ArrayList<Integer> list = new ArrayList<Integer>();
		list.add(position);
		map.put(word, list);
	} else {
		ArrayList<Integer> pos = new ArrayList<Integer>();
		pos.add(position);
		map.put(word, pos);
	}
}

—Đây là phương thức sắp xếp và in ra sô thư tự của từng phần tử trong file

public void displayText(String file) throws IOException {
	BufferedReader reader = new BufferedReader(new FileReader(file));
	int position = 1;
	String line = null;
	while (true) {
		line = reader.readLine();
		if (line == null)
			break;
		StringTokenizer token = new StringTokenizer(line, ", ");
		int count = token.countTokens();
		while (token.hasMoreTokens()) {
			String word = token.nextToken();
			int n = 1;
			if (n == count) {
				this.add(word, -position);
			} else {
				this.add(word, position);
			}
			position++;
			n++;
		}
	}
	reader.close();
	ArrayList<Map.Entry<String, ArrayList<Integer>>> list = new ArrayList<Map.Entry<String, ArrayList<Integer>>>();
	list.addAll(map.entrySet());
	Collections.sort(list, new Comparator<Map.Entry<String, ArrayList<Integer>>>() {
		@Override
		public int compare(Map.Entry<String, ArrayList<Integer>> o1, Map.Entry<String, ArrayList<Integer>> o2) {
			int n = o1.getKey().compareTo(o2.getKey());
			return n;
		}
	});
	System.out.println(list);
}

—Nhưng khi em run thì tự nhiên nó chia list làm 2 phần rồi mới sắp xếp từng phần em không hiểu <em thấy code của em đúng> mong anh chị giải đáp giúp em vơi
Em cảm ơn ak.

Đang làm từ điển à?

Nói thật là mình đọc đi, đọc lại và nhận ra rằng trong ifelse chẳng khác gì nhau. Có chăng chỉ là tên trường, nhưng chẳng ảnh hưởng đến việc chúng cùng làm 1 thao tác giống nhau.
Còn khai báo quăng ngoại lệ không liên quan nữa chứ.

Đoạn này là sao??? Ý mình là có sự “vô nghĩa” nào đó với nif - else.

:smiling_imp:
Bạn còn sai/chưa tối ưu rất nhiều chỗ. Và nên biết cách tự xử lý ngoại lệ với try - catch thay vì vứt nó cho máy ảo java. Đến khi có ngoại lệ xảy ra thì khốn khổ, chẳng biết đường mà vá.

Tại sao bạn biết nó chia list thành 2 phần???

2 Likes

Em đã thừa phương thức add
và em sửa lại như sau ạ

public void add(String word, int position) throws FileNotFoundException {
		ArrayList<Integer> list = new ArrayList<Integer>();
		list.add(position);
		map.put(word, list);
	}

—Về xử lý try - catch : thì em sẽ thử sau khi hoàn thành xong bài này <Em cũng mới học java>: Em cũng đang thắc mắc tại sao nó lại chia làm 2 rồi mới xắp xếp (Sau khi em run nó): vì vậy em mong anh có thể giải đáp :

À còn về phần if else phía dưới là do đề là như thế này anh ạ
For a given text file:
và yêu cầu phụ là nếu từ đó ở cuối line thì in ra thêm dấu trừ đằng trước
VD : chi=[43] phu=[-23] : chi vị trí trong file là 43 ; phụ vị trí trong file là 23 nhưng vì ở cuối line nên nó thêm dấu trừ đằng trước sau đó sắp xếp chúng
Đây là yêu cầu của đề.
—Anh giúp em tìm ra lỗi với ạ em run nó ok nhưng mắc một lỗi là nó chia thành 2 rồi mới xắp sếp

Em run nó ra vầy

[Chi=[30], City=[32], Computer=[-40], District=[28], Duc=[27],
Engineering=[43], Faculty=[34], Ho=[29], Information=[38],
Introduction=[1], Lam=[-19], Minh=[31], Nam=[16], Networks=[41],
Nong=[18], Software=[42], Systems=[39], Thu=[26], University=[20], Viet=[15], Vietnam=[33],
____________đến đây nó lại tách ra rồi sắp sếp 
a=[22], comprehensive=[-23], faculty=[4], has=[35], in=[25],
information=[6], is=[21], of=[5], or=[17], subjects:=[37],
technology=[7], the=[3], three=[36], to=[2], university=[24]]

Đề đâu? Yêu cầu chính đâu?

3 Likes


Dạ đây anh ạ.
Taskt 1 method 2
Cảm ơn anh ạ

Phương thức add của bạn có vẻ sai. nếu theo code của bạn thì mỗi lần add sẽ add một từ mới và một danh sách mới, điều gì sẽ xảy ra khi trong Map của bạn đã có word đó ( đồng nghĩa với việc word đó có danh sách vị trí). Thì với đặc thù của map khi bạn add map của bạn sẽ put(word, list) và sẽ ra 1 từ cũ nhưng là một danh sách vị trí mới :smiley:

1 Like

hình bạn chụp theo đề là đếm từ và hiển thị số lượng của mỗi từ, đâu liên quan gì đến câu hỏi của bạn ? Bạn hỏi về sort map và in ra các vị trí mà ???

1 Like


Em chụp lộn sorry mọi người. Và đây là yêu cầu
Task 2.3.: This method will display the content of the text file stored in the map.
__Phương thức add của em viết thì in ra vị trí theo đặc tính của map nó sẽ chỉ nhận một key duy nhất thôi do đó vị trí(list) của nó sẽ nhận giá trị mới(nếu file đã có tồn tại 1 word rồi) nó sẽ tự remove đi cái (position) cũ và add(word<cũ>, position<mới> ạ).
----Nhưng em đang ko hiểu tại sao khi run nó tự chia làm 2 rồi mới sắp xếp sau khi đã thử nhiều cách VD:(addall nó vô treemap hay sd hashset). Nó đề sắp xếp nhưng vẫn chia làm 2 như em post ở trên. Em không hiểu mong mọi người giải đáp

  • Muốn sắp xếp thì duyệt từng phần tử r add vào tree map thôi bạn
  • Còn phương thức add nếu add(word<cũ>, position<mới>) thì đâu đúng đề :)), đề của bạn mình đọc là một từ sẽ có một list danh sách vị trí mà. Nếu như bạn add như vậy thì mỗi từ chỉ có một vị trí thôi :slight_smile:
1 Like

nhưng đề yêu cầu dùng map mà anh nếu em dùng treemap thì em chỉ làm đc vậy thôi chứ nó ko cho dùng list mỗi cái chỉ có 1 word thôi nên em cũng chịu à thầy em bảo phải dùng tree vì ổng cho đề nên em phải làm thế thôi anh ạ. Anh còn cách nào khác không chỉ em với em vướng nó hết 3 ngày rồi

  1. Phương thức add() của bạn luôn thêm và ghi đè giá trị cũ. Chỉ tồn tại duy nhất 1 vị trí được thêm cuối cùng.

  2. Collections.sort() đã thực hiện hoàn toàn đúng. Sai là do bạn.
    Bạn có để ý là danh sách “bị chia 2” có khác biệt gì không? Chữ HOA và thường. Nó sắp xếp theo thứ tự giá trị của kí tự, các chữ thường luôn có giá trị lớn hơn (nằm sau) chữ HOA nên nó lọt tòi vào cuối.
    Lý do vì bạn quá làm biếng khi dùng luôn phương thức có sẵn (compareTo()) mà không tự viết.

5 Likes

à em hiểu rồi anh ạ.
em có thể sử dụng một vài phương thức sắp xếp cho nó–>Em cũng lười thật nên mới sai vì lỗi sai này em mất mấy ngày (Ngu thiệt)
Em cảm ơn anh ạ

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?