Перейти к содержимому

Фото
- - - - -

Ява


  • Вы не можете создать новую тему
  • Please log in to reply
56 ответов в этой теме

#1 OzzY

OzzY

    Великий и Ужасный

  • Пользователь
  • 461 сообщений

Отправлено 30 Сентябрь 2006 - 17:43

я хочу разделаить строку(читаю её из фаила), на лексемы(на отдельные слова), зная разделитель, как это проще сделать? Строка вида (слово,слово,слово,слово) Я делаю так:


FileReader file_reader = new FileReader(sourceName);
FileWriter file_writer = new FileWriter(copyName);
BufferedReader br_reader = new BufferedReader(file_reader);
PrintWriter pr_writer = new PrintWriter(file_writer);

String line = br_reader.readLine();
StringTokenizer t=new StringTokenizer(line,(", ")); //разделитель-запятая
while (line != null) {
while(t.hasMoreTokens()) { 
line=t.nextToken();
 pr_writer.println(line);
}
 line = br_reader.readLine();
}
Но в таком случае он выдает только первую строку с данными(без запятой), и при этом каждое слово в новой строке!

Сообщение изменено: OzzY (30 Сентябрь 2006 - 17:43 )

  • 0

#2 Cryptoboy

Cryptoboy
  • Пользователь
  • 280 сообщений

Отправлено 30 Сентябрь 2006 - 18:12

выводит слова через точку с запятой..
class Tokent
{
		public static void main(String args[])
		{
				String ts[] = {"bla, bla, bla", "ttt,   trtrtr", "f, f, f, f", "hu, hu, hu, hu"};
				for (int i = 0; i < ts.length; i++)
				{
					StringTokenizer p = new StringTokenizer(ts[i], ", ", false);
					while (p.hasMoreTokens())
					{
						String e = p.nextToken();
						System.out.print(e + "; ");	
					}			
					System.out.println();							
				}
		}
};

  • 0

#3 OzzY

OzzY

    Великий и Ужасный

  • Пользователь
  • 461 сообщений

Отправлено 30 Сентябрь 2006 - 19:22

к чему это? Что в моем коде не так, скажите!?
  • 0

#4 БугаГа

БугаГа
  • Пользователь
  • 260 сообщений
  • Откуда:-за

Отправлено 30 Сентябрь 2006 - 20:09

http://java.sun.com/...1.5.0/docs/api/ >> Constructor Summary StringTokenizer(String str, String delim) а не StringTokenizer(String str, (String delim) )
тобиш правильно
StringTokenizer t = new StringTokenizer( line, "," ); //разделитель-запятая

  • 0
First they ingore you. Then they laugh at you. Then they fight you. Then you win. © Mahatma Ghandi

#5 OzzY

OzzY

    Великий и Ужасный

  • Пользователь
  • 461 сообщений

Отправлено 30 Сентябрь 2006 - 20:20

не помогло, дает тот же результат. Пример, фаил у меня такой:

1,nimi,Arvo,string
2,nimi,Jaan,string
1,vanus,18,integer
2,vanus,20,integer
1,pikkus,185,integer
2,isikukood,38410122641,string
1,amet,3,uri
1,amet,4,uri
2,amet,5,uri
3,nimi,ehitaja,string
4,nimi,valvur,string
5,nimi,valvur,string
3,palk,15000,integer
4,palk,6000,integer
5,palk,2000,integer
1,omab,7,uri
2,omab,10,uri
7,tyyp,auto,string
7,mark,ford
7,hind,200000,integer
10,tyyp,maja,string
10,hind,2000000,integer
1,omab,autod.csv#2,uri
2,omab,autod.csv#1,uri

Обоими способами в исходящий фаил выходит только
1
nimi
Arvo
String

и все!
вот полный код:

import java.io.*;
import java.util.*;

public class ioproov1 {

  public static void main(String[] args) {
	
	String sourceName;
	String copyName;
	
	if (args.length == 2) {
	  sourceName = args[0];
	  copyName = args[1];	  
	}
	else {
	  System.out.println("Usage:  java ioproov <source-file> <copy-name>");	  
	  return;
	}
		 
	File file = new File(copyName);
	if (file.exists()) {
	  System.out.println("Output file exists. Exiting.");
	  return;  
	}
	
	try {
	  FileReader file_reader = new FileReader(sourceName);
	  FileWriter file_writer = new FileWriter(copyName);
	  BufferedReader br_reader = new BufferedReader(file_reader);
	  PrintWriter pr_writer = new PrintWriter(file_writer);

	  String line = br_reader.readLine(); 
	  StringTokenizer t=new StringTokenizer(line,",");
	 
	  while (line != null) {
	  while(t.hasMoreTokens()) {
	  line=t.nextToken();
	  pr_writer.print(line+" ");
	 }
	 
	  
	   // get next line of input file
		line = br_reader.readLine();
		
	  } // while loop
	  
	  file_reader.close();
	  file_writer.close();
	  
	} //try

	catch (IOException e) {
	 
	  System.out.println(e);
	  System.exit(1);
	}
  }
}


а еще я хотел бы поместить слова из фаила в отдельный массив words[n][4] - n-столбцов фаила и 4-количество слов в строке(всегда 4). Куда фор вставлять, если не делать промежуточный фаил, а сразу из сурсного фаила писать в массив?

Сообщение изменено: OzzY (30 Сентябрь 2006 - 20:23 )

  • 0

#6 Evja

Evja

    ♠ ♣ ♥ ♦

  • Постоялец
  • 6 077 сообщений

Отправлено 30 Сентябрь 2006 - 20:29

Зайка, прости за грубость!. инопланетяне.. ))
ps великолепный антимат :D

Сообщение изменено: EvilMaster (30 Сентябрь 2006 - 20:30 )

  • 0

#7 БугаГа

БугаГа
  • Пользователь
  • 260 сообщений
  • Откуда:-за

Отправлено 30 Сентябрь 2006 - 20:29

Я сразу увидел не пральные циклы :)
Попробуй
String line = br_reader.readLine();
	  while (line != null) {
		 StringTokenizer t=new StringTokenizer(line,",");
		  while(t.hasMoreTokens()) {
			 pr_writer.print( t.nexToken() );
		   }
		  pr_writer.println( );
	  
	   // get next line of input file
		line = br_reader.readLine();
		
	  } // while loop
Лень в доках рытся, не уверен насчот pr_writer.println и pr_writer.print. Смотри на код логически, на бумажке для начала циклы разрисуй, а мне некогда больше помогать :P

Сообщение изменено: БугаГа (30 Сентябрь 2006 - 20:29 )

  • 0
First they ingore you. Then they laugh at you. Then they fight you. Then you win. © Mahatma Ghandi

#8 Акей

Акей

    Смотрит свысока

  • Постоялец
  • 2 134 сообщений

Отправлено 30 Сентябрь 2006 - 20:33

Вот нагородили. Читаем мануал:
http://java.sun.com/...va.lang.String)
  • 0

#9 OzzY

OzzY

    Великий и Ужасный

  • Пользователь
  • 461 сообщений

Отправлено 30 Сентябрь 2006 - 21:08

а вопрос-то был только в этой строчке восновном...pr_writer.print( t.nexToken() ); а с циклами разобрался бы...спасибо.

Evilmaster, ты такой умный, тебе череп не жмет?
  • 0

#10 memfis

memfis
  • Пользователь
  • 169 сообщений
  • Откуда:Таллинн

Отправлено 30 Сентябрь 2006 - 22:08

мне бы так с С# помогли там легче=)
  • 0

#11 OzzY

OzzY

    Великий и Ужасный

  • Пользователь
  • 461 сообщений

Отправлено 01 Октябрь 2006 - 20:00

Очередная трабла...
BufferedReader br_reader = new BufferedReader(new FileReader(sourceName));
	String line;
	ArrayList word_mas = new ArrayList();
	while ((line=br_reader.readLine())!=null){
	  ArrayList word = new ArrayList();
	  for (StringTokenizer t = new StringTokenizer(line,",");t.hasMoreTokens();){
		word.add(t.nextToken());
	  }
	  word_mas.add(word);
	}
...
catch(){
}
return word_mas;
Выдает ошибку (именно в return) , что не найдена переменная word_mas! Дело в том, что в JSDK 1.4 все ок, а в 1.5 не работает? В чем дело?
  • 0

#12 Акей

Акей

    Смотрит свысока

  • Постоялец
  • 2 134 сообщений

Отправлено 01 Октябрь 2006 - 20:18

OzzY, нужен весь код.
п.с. Почитай на досуге конвенции Явы. В ней надо использовать камелкейс а не андерскоры. В любом случае придется переучиваться. Лучше сразу.
  • 0

#13 OzzY

OzzY

    Великий и Ужасный

  • Пользователь
  • 461 сообщений

Отправлено 02 Октябрь 2006 - 12:37

import java.lang.*;
import java.io.*;
import java.util.*; 


public class DataBase {
	static ArrayList words=new ArrayList(); //sozdaem globaljnqi spiso4nqi massiv dlja rabotq
   
	public static void main (String args[]) {
	String sourceName,funktsion,where,id;
	/*Get search parametrs from the command line.*/
	if ((args.length == 1)) {
	  sourceName = args[0]; //berem iz komandnoi stroki nazvanie faila
	  }
	else {
	  System.out.println("Usage:  java DataBase <source-file>)");	  
	  return;
	}
	words=file_read(sourceName);
	
}

public static ArrayList file_read(String sourceName) { /*ne uveren, 4to vozvrasjaemqi tip dolzen bqtj		ArrayList*/

try {
	BufferedReader br_reader = new BufferedReader(new FileReader(sourceName));
	String line;
	ArrayList word_mas = new ArrayList(); /*dvumernqi spiso4nqi massiv elementami kotorogo javljajutsja elementq spiso4nogo massiva word*/
	while ((line=br_reader.readLine())!=null){
	  ArrayList word = new ArrayList();
	  for(StringTokenizer t = new StringTokenizer(line,",");t.hasMoreTokens();) {
		word.add(t.nextToken()); //zapolnenie massiva word(po 4 elementa)
	  }
	  word_mas.add(word); //zapolnenie massiva word_mas, po koli4estvu strok v faile
	}//while

	  br_reader.close();
	} //try
   catch (IOException e) {
	  System.out.println(e);
	  System.exit(1);
 }  
 return word_mas;
}

и еще он мне вот такую штуку выплевывает: "Note: Recompile with -Xlint:unchecked for details." :blink:
  • 0

#14 Акей

Акей

    Смотрит свысока

  • Постоялец
  • 2 134 сообщений

Отправлено 02 Октябрь 2006 - 14:48

по первому вопросу: вынеси word_mas до try

и еще он мне вот такую штуку выплевывает: "Note: Recompile with -Xlint:unchecked for details."


удали все .class файлы и перекомпилируй все заново
  • 0

#15 OzzY

OzzY

    Великий и Ужасный

  • Пользователь
  • 461 сообщений

Отправлено 02 Октябрь 2006 - 17:30

О, с первым все ок...попробую теперь читать элементы из этого массива...
А надпись эту он все равно дает, я перекомпелировал с этим Xlint толку нет..
  • 0

#16 OzzY

OzzY

    Великий и Ужасный

  • Пользователь
  • 461 сообщений

Отправлено 02 Октябрь 2006 - 18:37

эдит:
Теперь появляется новая проблемма. Массив word_mas является массивом массивов, тоесть в нем содержится еще массив word. Но в main я объявляю другой массив words, который все-таки одномерным является! Как же так? Мне нужно иметь двумерный массив, чтобы искать слова по строчкам, а у меня только одномерный..вот(
  • 0

#17 Акей

Акей

    Смотрит свысока

  • Постоялец
  • 2 134 сообщений

Отправлено 02 Октябрь 2006 - 19:16

OzzY, ты это тут меня не путай:)

У тебя массивов в проге нет ваще, ты используешь Листы, в данном случае АррэйЛисты.

Их можно прокручивать Фор-ом а также с помошью итератора. Гугл тебе в помошь, примеров куча. Потом кастишь к соответственному типу и используешь

По поводу этого ключа - скорее всего из за того что ты играл с разными явами. Почитай Гугл, там есть пути решения.
  • 0

#18 OzzY

OzzY

    Великий и Ужасный

  • Пользователь
  • 461 сообщений

Отправлено 02 Октябрь 2006 - 19:54

вечно все так...гугль, гугль...зачем тогда этот форум, если на нем тебя все равно посылают на другие форумы? Нет, чтобы указать ошибку или помочь...жестокие((.
  • 0

#19 adix

adix
  • Пользователь
  • 32 сообщений

Отправлено 02 Октябрь 2006 - 20:11

поверь, если сам найдёшь пользы будет намного больше, чем если тебе скажут
  • 0

#20 Акей

Акей

    Смотрит свысока

  • Постоялец
  • 2 134 сообщений

Отправлено 02 Октябрь 2006 - 20:26

OzzY, ты думаешь я или какойто товарищь знают все о чем-либо. Тут тебе дают наводку в каком направлении копать, ты вбиваешь вгугл и находишь ответ. Когда я тока набивал первые шишки - чуть что - сразу ишу решение. Не стоит думать что такая ошибка выскочила только у тебя, скорее всего проблема уже решена
  • 0

#21 OzzY

OzzY

    Великий и Ужасный

  • Пользователь
  • 461 сообщений

Отправлено 02 Октябрь 2006 - 20:42

да, так в том и дело, если бы знать, что искать. А ведь никаких намеков? Везде примеры использования ArrayList(), пусть даже в другом ArrayList() (как у меня), но нигде нет примеров, чтобы возвращались эти значения из одной функции в другую и присваивались другой переменной ткого же типа! Да и все примеры, что я видел работают с объектами, а мне пока это не особо нужно, только голову забивает!
  • 0

#22 Акей

Акей

    Смотрит свысока

  • Постоялец
  • 2 134 сообщений

Отправлено 02 Октябрь 2006 - 21:25

Запомни, кроме простых типов, типа int, double, boolean v Jave все обьект
в следуйсуххем коде подразумевается что датаБасе - лист, который возвратила твоя мегафункция. И пожалуйста не незывай листы массивами, тебе за это руководители по практике вставят. Что и куда-не буду распространяться :)

import java.util.ArrayList;


public class Sample {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ArrayList dataBase = new ArrayList();
		for(int i = 0; i < dataBase.size(); i++) {
			ArrayList row = (ArrayList)dataBase.get(i);
			System.out.println("Starting to print row number" + i);
			for(int j = 0; j < row.size(); j++){
				String cell = (String)row.get(j);
				System.out.println("Cell value is:" + cell);
			}
		}
		
	}
}


  • 0

#23 OzzY

OzzY

    Великий и Ужасный

  • Пользователь
  • 461 сообщений

Отправлено 03 Октябрь 2006 - 14:47

хех, не у меня вроде на практике добродушный препод, все ок. Да и для быстроты просто называю массивами.
А не мог бы ты это код пояснить немного? Насколько я понимаю создается еще один лист. Первоначально(при создании), он не содержит дополнительного листа, так? А потом при чтении его создается еще один лист row, так? Но ведь его размер не определен еще? Так как же используется row.size(); ?? странно...хотя все работает ок...спасибо.
  • 0

#24 Акей

Акей

    Смотрит свысока

  • Постоялец
  • 2 134 сообщений

Отправлено 03 Октябрь 2006 - 15:46

OzzY, этот лист я создал просто так, чтобы код скомпилировался. В твоей проге должно быть чтото вроде

ArrayList dataBase = file_read("somename.csv")

В нем результат чтения файла твоей функцией. Ты проходишся по етому листу Фором. В нем стока елементов скока строк в файле. Ты знаешь, что Обэкт строки - тоже лист - лист обэктов типа "строка". Поетому кастиш ряд в АррэйЛист, а потом эго элементы в строки.

В листов динамический размер, сколько туда пихнеш, столько и будет. Массивы в яве редко используются
  • 0

#25 OzzY

OzzY

    Великий и Ужасный

  • Пользователь
  • 461 сообщений

Отправлено 03 Октябрь 2006 - 15:47

да, это так..с этим я разобрался. Спасибо. Буду теперь парсер дальше пробовать:S
  • 0

#26 OzzY

OzzY

    Великий и Ужасный

  • Пользователь
  • 461 сообщений

Отправлено 05 Октябрь 2006 - 17:24

Скажите, есть ли в Яве что-то, чтобы можно было СЛОВО искать по определенному СИМВОЛУ, содержащемуся в этом слове?
  • 0

#27 Акей

Акей

    Смотрит свысока

  • Постоялец
  • 2 134 сообщений

Отправлено 05 Октябрь 2006 - 20:22

OzzY, в чем искать?
если в строке, то делаешь сначала split() по пробелам, потом пролистываешь массив и indexOf()-ом все проверяешь
Если в листе, то также пролистываешь его и проверяешь каждый елемент.

стандартной такой изврашенной функции нет
  • 0

#28 OzzY

OzzY

    Великий и Ужасный

  • Пользователь
  • 461 сообщений

Отправлено 06 Октябрь 2006 - 12:23

Ну дело в том, что после того как я свой список начал проверять, выделил оттуда еще один список, который имеет такое содержание:
[7, 10, autod.csv#2, autod.csv#2] . Затем я хочу autod.csv#2 разбить отдельно на autod.csv и 2 и затем поместить тоже куда-нить в список. Для это использую вот такую функцию(здесь ArrayList uri_id приведенный выше список):
public static ArrayList split(ArrayList uri_id) {
	ArrayList array=new ArrayList();
 	ArrayList copy=new ArrayList();
				String str="";
	String [] string=new String[uri_id.size()];
	for(int i=0;i<uri_id.size();i++) {
 		str=str+(String)uri_id.get(i);
 	}
 	StringTokenizer t = new StringTokenizer(str,"#");
 	while(t.hasMoreTokens()) {
 		copy.add(t.nextToken());
 	}
 	array.add(copy);
 	return array;	
}
но таким кодом я получаю вот такой список:
[[710autod.csv, 2, autod.csv, 2]]
Any ideas?
  • 0

#29 Акей

Акей

    Смотрит свысока

  • Постоялец
  • 2 134 сообщений

Отправлено 06 Октябрь 2006 - 23:43

:) далеко пойдешь, но вначале набьешь себе кучу шишек

Я твой код не запускал, но по идее ин должен выдавать не то что ты пишешь, а [[710autod.csv, 2autod.csv, 2]]

Да и что тебе этот токенайзер так понравился-то?

я бы написал так:

	public static ArrayList split(ArrayList source) {
		ArrayList<String> result = new ArrayList<String>();
		for(int i = 0; i < source.size(); i++){
			String element = (String) source.get(i);
			if(element.indexOf("#") > -1) {
				String[] temp = element.split("#");
				result.add(temp[0]);
				result.add(temp[1]);
			}
			else {
				result.add(element);
			}
		}
		return result;	
	}

Сообщение изменено: Акей (06 Октябрь 2006 - 23:44 )

  • 0

#30 OzzY

OzzY

    Великий и Ужасный

  • Пользователь
  • 461 сообщений

Отправлено 07 Октябрь 2006 - 16:48

Не знаю, токенизер позволяет работать с ArrayList, а тут нужна строка. Ну не в том смысле, что в качестве аргумента токенизер список берет...ну вообщем, смысл в том, что твоя функция сделала просто список result, в нем нет другого списка, тоесть он "одномерный". А мне нужно было получить двумерный, в котором один аргумент был бы имя фаила, а другой этот номер.

А теперь мне нужно имя фаила и номер выбирать оттуда как четный и нечетный элементы. А вот это не получается. В цикле по всему списку result четные элементы с каким индексом пойдут? А нечетные?
  • 0