Перейти до вмісту

Пошук унікальних символів в рядку (Java)


Повідомлень в темі: 6

#1 Dimetrius

    Абориген

  • Користувачі
  • PipPipPipPip
  • 75 повідомлень
  • Стать:Чоловік

Відправлено 11.10.2008 – 20:04

  • 6
Завдання таке:

Мені потрібно на ДЖАВІ створити програму яка у введеному параметрі (слові) шукає символи, що не повторюються.

Алгоритм на мою думку такий:

Циклом перетворюємо введений параметр із типу string в масив даних типу char:

public class BSC {public static void main(String[] arguments){
System.out.println(arguments[0]);
char[] masuvDanux = new char[arguments[0].length()+1];
int k=0;

int dovzhuna = arguments[0].length();
for (int i=0; i<dovzhuna; i++){
masuvDanux[k]=arguments[0].charAt(i);
k++;
}

Потім порівнюємо дані елементи один з одним і шукаємо однакові. Якщо такі знайдені то затираємо їх пересуваючи кожен наступний, на одиницю вліво.

for (int i=0; i<dovzhuna; i++){
for (int j=i+1; j<dovzhuna; j++)
if (masuvDanux[i]==masuvDanux[j]) {
for (int h=j; h<dovzhuna-1; h++){
masuvDanux[h]=masuvDanux[h+1];
j++;
}}}}}

Таким чином даний масив "по ідеї" мав би перетворюватися в масив де значення літери зустрічається тільки один раз. Але ...
- по перше: як мені вивести тільки ці елементи?
- по друге: алгоритм, ну якшо бути правильнішим то мій код, працює тільки у випадку якщо елементів що повторюються тільки 2. Наприклад, зразок введеного і виведеного:

cnnhjjh
cnhjhhh

Але якщо букв n зробити 4 то:

cnnnnhjjh
cnnhjhhhh

Підкажіть помилку в алгоритмі або ще краще в коді. Можливо java уже має в собі функції приблизного характеру для роботи з даними типу стрінг, тобто функції, які шукають симоли що повторюються, не повторюються в рядку і тд і тп. Можливо є легший або логічніший алгоритм... Підкажіть пліз бо вже тиждень мучаюсь... Ідей, алгоритмів і кодів було уйма... Бували випадки що ніби і працює правильно, але якшо ввести інші параметри відразу "матюкається".

#2 Lukom

    Абориген

  • Користувачі
  • PipPipPipPip
  • 112 повідомлень
  • Стать:Чоловік
  • Місто:Ukraine-Lviv

Відправлено 11.10.2008 – 20:27

Найкращим алгоритмом буде пройтися по вхідному рядку і занести частоту повторень для кожної букви в масив. Тоді пройтися по цьому масиву, і вивести ті букви, де частота > 1.

Для шукання "де помилка", юзай дебаг.
  • 0

#3 d^.^b

    убухана скотина

  • Користувачі
  • PipPipPipPipPipPipPipPipPipPip
  • 1206 повідомлень
  • Місто:ілюзії

Відправлено 11.10.2008 – 20:32

скажу одразу шо яву нешарю
але кожна поважаюче себе мова програмування
повинна мати певні функції для текстових об’єктів :)

трохи поґуглиф і знайшоф фігню
яка каже шо можна забити в масив результат пошуків по тексту
але може це і не воно ))))
  • 0

#4 Dimetrius

    Абориген

  • Користувачі
  • PipPipPipPip
  • 75 повідомлень
  • Стать:Чоловік

Відправлено 11.10.2008 – 23:42

Перегляд дописуLukom (11.10.2008 21:27) писав:

Найкращим алгоритмом буде пройтися по вхідному рядку і занести частоту повторень для кожної букви в масив. Тоді пройтися по цьому масиву, і вивести ті букви, де частота > 1.

Для шукання "де помилка", юзай дебаг.

public class mitka {public static void main (String[] arguments){
int size = arguments[0].length();
char[] masuvDanux = new char[size];
int[] mitka = new int[size];
for (int i=0; i<size; i++){
mitka[i]=0;
masuvDanux[i]=arguments[0].charAt(i);
}
for (int i=0; i<size-1; i++){
for (int j=i+1; j<size; j++){
if (masuvDanux[i]==masuvDanux[j]) mitka[i]++;
}
}

for (int i=0; i<size; i++){
if (mitka[i]==0) {System.out.print(masuvDanux[i]+" ");}
}
}
}

Дуже дякую, я думаю Ви це мали на увазі? Якщо чесно в мене ідей багацько було і було подібна ідея з міткою, але вона в мене була тільки одна, не масив, ніби для кожного елемента окрема. Першу половину завдання Ви мені допомогли розв'язати, допоможіть і другу... Взагалі суть усього завдання, це створити програму, яка би в декількох словах відшукувала рядок символів, які зустрічаються тільки в родному з них, таких ніби унікальних для тексту символів. Але якщо вони повторюються в одному слові то це допустимо. Наприклад для тексту "boolean type" таким масивом унікальних елементів мав би бути "bolantyp", тобто буква "о" зустрічається 2 рази, але в одному слові. Вона не є унікальною для слова, але є унікальною для тексту. Я думав спочатку відшукати такі унікальні символи у кожному слові, потім об'єднати усе, що получилося в один масив і застосувати той самий алгоритм для цього уже об'єднаного масиву. Але якщо застосовувати такий спосіб, то той символ який повторюється хочаби раз, але виводиться, а цього не потрібно. Як правильніше поставити умову на вивід?

Повідомлення відредагував Dimetrius: 11.10.2008 – 23:44

  • 0

#5 Lukom

    Абориген

  • Користувачі
  • PipPipPipPip
  • 112 повідомлень
  • Стать:Чоловік
  • Місто:Ukraine-Lviv

Відправлено 12.10.2008 – 08:11

Та сама задача, тільки з'являється масив з використаних букв. При обробці букви, спочатку дивимось чи вона є у масиві. Не забуваємо чистити масив на пробілах. Ось розв'язок:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		String str = in.nextLine();
		Map<Character, Integer> frequency = new HashMap<Character, Integer>();
		List<Character> used = new ArrayList<Character>();

		for (int i = 0; i < str.length(); ++i) {
			char c = str.charAt(i);
			Integer f = frequency.get(c);
			if (Character.isWhitespace(c)) {
				used.clear();
			} else {
				if (used.contains(c)) {
					continue;
				}
				frequency.put(c, f == null ? 1 : f + 1);
				used.add(c);
			}
		}

		for (Character c : frequency.keySet()) {
			Integer f = frequency.get(c);
			if (f == 1) {
				System.out.print(c);
			}
		}
	}
}

  • 0

#6 Lukom

    Абориген

  • Користувачі
  • PipPipPipPip
  • 112 повідомлень
  • Стать:Чоловік
  • Місто:Ukraine-Lviv

Відправлено 12.10.2008 – 11:27

Також можна побавитись із множинами символів. Ось ще 1 розв'язок, тут з кожного слова дістається множина символів, потім всякими перетинами і об'єднаннями дістається потрібна нам множина:

import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

import org.apache.commons.lang.ArrayUtils;

public class Main {
	public static void main(String[] args) {
		Set<Character> goodChars = new HashSet<Character>();
		Set<Character> used = new HashSet<Character>();

		Scanner in = new Scanner(System.in);
		String str = in.nextLine();
		String[] words = str.split("\\s+");

		for (int i = 0; i < words.length; ++i) {
			Set<Character> word = new HashSet<Character>(Arrays
					.asList(ArrayUtils.toObject(words[i].toCharArray())));

			Set<Character> intersect = new HashSet<Character>(word);
			intersect.retainAll(used);

			goodChars.removeAll(intersect);
			word.removeAll(intersect);
			goodChars.addAll(word);
			used.addAll(word);
		}

		System.out.println(goodChars);
	}
}

Один нюанс - тут використано клас ArrayUtils із апачівської біліотеки commons lang для конвертування char[] в Character[], хоча можна було б написати і окрему функцію.
  • 0

#7 Dimetrius

    Абориген

  • Користувачі
  • PipPipPipPip
  • 75 повідомлень
  • Стать:Чоловік

Відправлено 12.10.2008 – 14:15

Я вже в принципі знайшов вирішення усієї задачі:

/**
 * Created by IntelliJ IDEA.
 * User: Администратор
 * Date: 12 жовт 2008
 * Time: 1:16:02
 * To change this template use File | Settings | File Templates.
 */
public class BaseClassForLaba2 {public static void main(String[] arguments){
	System.out.println("3agaHi napaMeTpu:");

	for(int i=0; i<arguments.length; i++){
		System.out.print(arguments[i]+" ");
	}

	System.out.println("\n\nKiJIbKiCTb 3agaHux napaMeTPiB:"+arguments.length+"\n");
	analizParametriv(arguments);


}
	 public static int najdovwujParametr (String[] parameters){
		int i, max=0;
		for (i=0; i<parameters.length; i++) {
			if (parameters[i].length()>max) max=parameters[i].length();
		}
		return max;
	}

	public static void analizParametriv (String[] parameters){
		boolean peremukach=false;
		int r=0;
		char[] objednanujMasuv = new char [parameters.length*najdovwujParametr(parameters)];
		for (int q=0; q<parameters.length; q++){
			int size = parameters[q].length();
			char[] masuvDanux = new char[size];
			int[] mitka = new int[size];
			for (int i=0; i<size; i++){
				mitka[i]=0;
				masuvDanux[i]=parameters[q].charAt(i);
			}
			for (int i=0; i<size-1; i++){
				for (int j=i+1; j<size; j++){
					if (masuvDanux[i]==masuvDanux[j]) {mitka[j]++;}
				}
			 }

			for (int i=0; i<size; i++){
				if (mitka[i]==0) {objednanujMasuv[r]=masuvDanux[i]; r++;
					}
			}
		}

		int[] mitka = new int[r];
		for (int i=0; i<r; i++) mitka[i]=0;

		int g=0;
		char[] masuvRezultativ = new char[r];
		for (int i=0; i<r-1; i++){
			for (int j=i+1; j<r; j++){
				if (objednanujMasuv[i]==objednanujMasuv[j]) {
					mitka[i]++;
					mitka[j]++;
				}
			}
		}

		System.out.println("CuMBOJIu, 9Ki 3yCTPI4A}0TbC9 TiJIbKu B ogHoMy 3 napaMeTPiB:");
		for (int i=0; i<r; i++){
		if (mitka[i]==0) {peremukach=true; System.out.print(objednanujMasuv[i]+" ");}
	}
		if (!peremukach) System.out.println("Takux CuMBOJIiB HEMA!!!");
	}
}

Звичайно, можливо, код здається кострубатим, але тим не менше працює))) А це головне.
Просто я Джаву тільки почав вивчати і ще не дуже глибоко в неї зарився...

Ось ця от штука наприклад:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;...

... я то ніби розумію, що імпортуються якісь бібліотеки... Але от для чого?... Це ще треба не один день в неті посидіти і поритись.
  • 0



Кількість користувачів, що читають цю тему: 1

0 користувачів, 1 гостей, 0 анонімних


Магазин кубиков Рубика Cubes.in.ua