Comparing character-by-character

I'm playing around with a Java implementation of a ternary search tree. (See http://www.ddj.com/documents/s=921/ddj9804a/9804a.htm)
By its very nature, a TST must compare its keys character-by-character.
I've got a base implementation I am happy with, and am now looking at SortedSet and SortedMap implementations, which are naturals for a TST. In order to fully support either interface, I should support creation of a SortedSet or SortedMap with a Comparator specified.
I just want to confirm my understanding, after studying the API documentation and poking around in the API source code, that I can safely use CollationElementIterator to compare two strings one character at a time.
Specifically, the TST stores an inserted key internally as one character per tree node. When searching, a search key is compared to nodes one character at a time, and the tree is descended according to whether the comparison yields less than, equal or greater than. I am expecting that I can store the int value of each collation element in the nodes, then compare them to the int values of each collation element for a search key. (I do not expect to reconstruct the string from the int values--the original string is referenced at its terminal node. Nor do I care in the least if the number of int values does not match the number of characters in the text string, or if they are in a different sequence than the corresponding characters.)
If my understanding is correct, I won't have to worry about skipping over characters in a string or swapping character positions--that will be taken care of as the iterator steps through the string. Nor will I have to worry about characters that alter the sort priority of other characters. This would be quite nice.
I would appreciate confirmation (or correction) from somone who is familiar with the classes java.text.RuleBasedCollator, java.text.CollationKey and java.text.CollationElementIterator. With preference, this would be someone who has actually used them in an application.
How I plan to test this thing is, of course, another problem...

The answer is "yes." CollationElementIterator is intended to be used exactly as I understood from the API documentation.
I found my confirmation in this article:
http://www-106.ibm.com/developerworks/java/library/j-text-searching.html
and validation of the algorithm in this Unicode Technical Standard:
http://www.unicode.org/unicode/reports/tr10/

Similar Messages

  • How to compare character with \ ?

    Hi,
    How can I compare a character with backslash ?
    when I do 
    if  (c == '\')
    then it gives error invalid character constant
    I cant even declare string with this value like
    String str = "\";
    this gives error string literal is not properly closed by double qoute
    thanks in advance
    B

    Hi,
    You can use the below
    String str = "\\";
    char c = '\\';
    * are considered as \ at runtime.
    Regards,
    Sruti

  • How to compare character/digits

    Hi,
    I have retrieved the last two character(it may be numbers or alphabets) of a string, using substr function. I want to compare the retrieved characters. Please help me how to do the same.
    Regards
    Uva

    Since both are varchar2 columns,
    SImply try beow..
    Let us think that u have two field -Filed1 and Filed2 - both are varchar2 type, then to compare, do below
    If Upper(Filed1) = Upper(Filed2) Then
    ----- Equal -Message
    Else
    --else Message
    End If

  • Compare character variable in dynamic sql

    hi all
    i have a requirment in which i'll be using a dynamic sql:
    sql_string :='select * from temp_table where emp_name='||v_name;
    execute immediate ;
    i'm getting this error
    ORA-06502: PL/SQL: numeric or value error
    this is becouse v_name is character variable and we have to write
    select * from temp_table where emp_name='joe';
    can any one plz help me out..

    More correctly you should use bind variables (if you really really have to do dynamic SQL in the first place)...
    sql_string :='select * from temp_table where emp_name=:n;
    execute immediate sql_string using v_name;This allows the optimiser to re-use the execution plan rather than hard-parsing the query every time.
    However this still isn't right because within PL/SQL you will need to be selecting your result INTO something e.g.
    sql_string :='select * from temp_table where emp_name=:n;
    execute immediate sql_string into v_data using v_name;v_data will be a variable declared suitably to accept whatever data is being selected in the query.

  • Questioning design decision in java.lang.Character

    Having a look at the source code for java.lang.Character, I have the Character class explicitly extends Object
    I am using jre1.6.0_07 on window XP
    Now the question is what is the reason for such a decision and we all know that any class implicitly extends Object class.
    public final class Character extends Object implements java.io.Serializable, Comparable<Character> {
    }Regards,
    Alan Mehio
    London, UK
    Edited by: alan_mehio on 24-Jul-2009 12:31

    I cannot answer with anything but personal intuition, and give non-conclusive details:
    first this is not a design decision, merely a style decision, since, as you mention, any class implicitly extends directly java.lang.Object if not explicitly extending anything else (and at the bytecode level, the source-level difference is undetectable).
    As far as style is concerned, I would have assumed that the whole JDK team is required to strictly follow consistent rules, but different classes suggest otherwise.
    Sun's public [Code Conventions for the JavaTM Programming Language|http://java.sun.com/docs/codeconv/html/CodeConventions.doc5.html#2991] do not have an explicit rule about this; section +6.4 Class and Interface Declarations+ provide an example with an extends Object clause, but the rule is not explicit in the text; and the previous section 5.2 does provide an example without this clause...
    I went on speculating that the developpers for the Character class had a special intent in mind, as they override Object methods equals() and hascode(), but other class in the same package do the same without the explicit extends Object clause (Void, System, Number). At that step I gave up trying to find a reason other than the developers' own style...

  • Comparing each character of two words.

    I want to compare individual characters of two words. What is the best option to do so?

    Depending on what you mean by "similar", you may want to create a table of similar characters. For example, a character might be considered similar to another character if it's next to it on a QWERTY keyboard.
    Another thing you may want to consider is number of deviations. What if every corresponding character between two strings is similar, not an exact match? Do you want to put a cap on the number of deviant characters?*
    Do the deviant character have to appear only at the ends of words?
    You may also want to look at the Soundex algorithm. Maybe there's an existing java implementation. Here's something I found from a quick google:
    http://sourceforge.net/snippet/detail.php?type=snippet&id=100251
    * I just wanted an excuse to say "deviant characters"

  • Comparing to_date(character) and date(Urgent)

    Hi ,
    I'm having data in one file like this.
    iso_sttl_ref
    DA_DEMO_03082005_03012005-S7
    I'm doing the substring of the above field and I'm converting into date by using to_date function and comparing with a date coming as parameter. but i'm getting an error not a valid month.
    Select distinct (case when ns.ptcpt_cd='DEMO' then substr(iso_sttl_ref,9,8)end)sttl_date,
         trunc(ns.start_dt_gmt)start_dt,ns.sttl_pub_cd,ns.ptcpt_cd,iso_sttl_ref
    from nm_settlement ns, nm_sttl_statement nss
    where ns.statement_id = nss.statement_id
    and trunc (nss.inactive_dt_sys) =to_date ('31-DEC-4000', 'DD-MON-YYYY')
    and to_date(to_number(substr(iso_sttl_ref,9,8)),'mm/dd/yyyy')>=TO_date('10/01/2005','MM/DD/YYYY')
    and to_date(to_number(substr(iso_sttl_ref,9,8)),'mm/dd/yyyy')<=TO_date('10/07/2005','MM/DD/YYYY')
    and ns.source_cd = nvl ('ISO', 'ESTIM')
    and ns.sttl_pub_cd <> 'S7'
    and ns.ptcpt_cd='DEMO'
    and ns.sttl_type_cd='DASTTL'
    order by ns.sttl_pub_cd
    Pls help me out from this problem . your help is greatly appreciated.
    Thanks & Regards,
    Ramana.

    Hi ,
    I'm perfectly getting numerical values no funny character also coming.
    SQL*Plus: Release 10.2.0.1.0 - Production on Tue Nov 22 13:06:46 2005
    Copyright (c) 1982, 2005, Oracle. All rights reserved.
    Connected to:
    Oracle9i Enterprise Edition Release 9.2.0.5.0 - 64bit Production
    With the Partitioning option
    JServer Release 9.2.0.5.0 - Production
    SQL> Select distinct (case when ns.ptcpt_cd='DEMO' then to_date(substr(iso_sttl_ref,9,8),'mm/dd/yyy
    y')
    2 when ns.ptcpt_cd='DEMORE' then to_date(substr(iso_sttl_ref,15,8),'mm/dd/yyyy')
    3 end)sttl_date,
    4 trunc(ns.start_dt_gmt)start_dt,ns.sttl_pub_cd,ns.ptcpt_cd,substr(iso_sttl_ref,9,8)
    5 from nm_settlement ns, nm_sttl_statement nss
    6 where ns.statement_id = nss.statement_id
    7 and trunc (nss.inactive_dt_sys) =to_date ('31-DEC-4000', 'DD-MON-YYYY')
    8 --and to_date( substr(iso_sttl_ref,9,8),'mmddyyyy')>=to_date('10/01/2005','MM/DD/YYYY')
    9 --and to_date( substr(iso_sttl_ref,9,8),'mmddyyyy')<=to_date('10/07/2005','MM/DD/YYYY')
    10 and trunc (nss.master_rpt_version_dt_sys) >=TO_DATE('10/01/2005','MM/DD/YYYY')
    11 and trunc (nss.master_rpt_version_dt_sys) <=TO_DATE('10/07/2005','MM/DD/YYYY')
    12 and ns.source_cd = nvl ('ISO', 'ESTIM')
    13 and ns.sttl_pub_cd <> 'S7'
    14 and ns.ptcpt_cd='DEMO'
    15 and ns.sttl_type_cd='DASTTL'
    16 order by ns.sttl_pub_cd
    17 /
    STTL_DATE START_DT STTL_P PTCPT_ SUBSTR(I
    02-OCT-05 30-APR-05 R155 DEMO 10022005
    03-OCT-05 01-MAY-05 R155 DEMO 10032005
    04-OCT-05 02-MAY-05 R155 DEMO 10042005
    05-OCT-05 03-MAY-05 R155 DEMO 10052005
    06-OCT-05 04-MAY-05 R155 DEMO 10062005
    07-OCT-05 05-MAY-05 R155 DEMO 10072005
    08-OCT-05 06-MAY-05 R155 DEMO 10082005
    02-OCT-05 19-JUN-05 S105 DEMO 10022005
    03-OCT-05 20-JUN-05 S105 DEMO 10032005
    04-OCT-05 21-JUN-05 S105 DEMO 10042005
    05-OCT-05 22-JUN-05 S105 DEMO 10052005
    STTL_DATE START_DT STTL_P PTCPT_ SUBSTR(I
    06-OCT-05 23-JUN-05 S105 DEMO 10062005
    07-OCT-05 24-JUN-05 S105 DEMO 10072005
    08-OCT-05 25-JUN-05 S105 DEMO 10082005
    02-OCT-05 18-SEP-05 S14 DEMO 10022005
    03-OCT-05 19-SEP-05 S14 DEMO 10032005
    04-OCT-05 20-SEP-05 S14 DEMO 10042005
    05-OCT-05 21-SEP-05 S14 DEMO 10052005
    06-OCT-05 22-SEP-05 S14 DEMO 10062005
    07-OCT-05 23-SEP-05 S14 DEMO 10072005
    08-OCT-05 24-SEP-05 S14 DEMO 10082005
    02-OCT-05 08-AUG-05 S55 DEMO 10022005
    STTL_DATE START_DT STTL_P PTCPT_ SUBSTR(I
    03-OCT-05 09-AUG-05 S55 DEMO 10032005
    04-OCT-05 10-AUG-05 S55 DEMO 10042005
    05-OCT-05 11-AUG-05 S55 DEMO 10052005
    06-OCT-05 12-AUG-05 S55 DEMO 10062005
    07-OCT-05 13-AUG-05 S55 DEMO 10072005
    08-OCT-05 14-AUG-05 S55 DEMO 10082005
    28 rows selected.

  • Comparing the 1/2 character

    hi there,
    I'm reading an input stream which contains a character that represents the fraction 1/2.
    Using the 1.3 jdk I was able to do a string comparison with the 1/2 character, and what was read in through the input stream.
    However, using the 1.4 jdk, what is read in through the input stream is what looks like a capital S. I cannot compare the 1/2 character nor a capital S successfully with this character.
    Can someone tell me what sort of character encoding I need to do in order for it to work?
    thanks
    Daniel

    The encoding (it is default) is ISO-8859-15
    ISO-8859-15 does not have the "one half" character. You need to change the encoding you use for reading to ISO-8859-1 which probably is the encoding the page is in.
    (Indeed, if I go to that page using iso-8859-15 as the encoding (which I've configured as the default) I see the ligature oe, but when I change the encoding the browser uses to iso-8859-1 the character changes to "one half". Wonder how you got a thing that looks like S, "oe" doesn't look like S to me...)
    You can change the encoding by passing its name as a parameter to the InputStreamReader constructor:InputStreamReader isr  = null;
    try {
        isr = new InputStreamReader(connxn.openStream(), "iso-8859-1");
    } catch (UnsupportedCharacterEncodingException ignore) {
        // as if it could ever be thrown with iso-8859-1...
    BufferedReader in = new BufferedReader(isr);Web pages are a mess since the introduction of euro and iso-latin-15, now some western sites are in iso-latin-1, some in iso-latin-15 and some in cp1252 and it gets quite awkward when they use characters that are not in the same code points, such as smart quotes or the euro character... Or, in this case, the one over two character.

  • How can i compare the character fields?

    I have a requirement to compare the character fields .
    I have to compare the 2 character fields of a table CDPOS
    As follows .
      If CDPOS-VALUE-OLD  GT  CDPOS-VALUE-NEW
          Populate    REDATED = ‘YES’.
    ELSE
          Populate  REDATED = ‘NO’.
    My doubt here is how can we compare the character fields.?
       When I do Extended Program Check: I am getting error like this ?
    Greater than/less than comparisons with character type operands may not be portable
    Please give me idea .
    Thanks ,
    Suresh Kumar.

    Hi suresh,
    DATA : a TYPE char10  VALUE 'DBCD',
           b TYPE char10  VALUE '4234',
           c TYPE char10  VALUE '3456',
           d TYPE char10  VALUE 'ADA',
           e TYPE char10 VALUE  '234567'.
    IF b GT c.        "this case checks for numeric values
      WRITE :/ 'B is bigger'.
    ELSE.
      WRITE :/ 'C is bigger'.
    ENDIF.
    IF a GT d.      "this case checks for alphbetical order
      WRITE :/ 'A is bigger'.
    ELSE.
      WRITE :/ 'D is bigger'.
    ENDIF.
    IF strlen( a ) GT strlen( d ). "this case checks for no of chars
      WRITE :/ 'A is bigger'.
    ELSE.
      WRITE :/ 'D is bigger'.
    ENDIF.
    IF a GT c.      "this case first alph then numerics
      WRITE :/ 'A is bigger'.
    ELSE.
      WRITE :/ 'D is bigger'.
    ENDIF.

  • Compare two columns character by character

    Hi
    In a form I have block A. Which contains two columns Old Value and New Value both are of varchar datatype. I want to compare Old Value and New Value character by character and display the characters which are there in New Value but not in Old Value in a different colour when this block is being called.
    Example1 :Old Value : 13-Jul-2007
    And New Value : 19-Jul-2007
    I need the output to be display in this way - 19(in different clour)-Jul-2007. Only 9 should be in different colour.
    Example2 :Old Value : - (No value Previously)
    And New Value : SI DONE
    So output to be display in this way New Value "SI DONE" should be in different colour.
    Just to hightlight the users that this is change made instead of they manually compare field by field for the changes to take note..
    Pls help me this is bit urgent. Help me to suggest any java related coding can help me or any plugins that we can call thru forms to do it.. Pls help.
    Rishi

    You take a variable i (integer type) and initialize it to 1.
    Take a loop where u'll find one by one character in loop as follows.
    DECLARE
    i NUMBER(10) := 1;
    old_str VARCHAR2(240); -- For Old String
    new_str VARCHAR2(240); -- For New String
    differed_str VARCHAR2(240) := '';
    BEGIN
    WHILE i <= GREATEST(LENGTH(old_str),LENGTH(new_str))
    LOOP
    IF SUBSTR(old_str,i,1) <> SUBSTR(new_str,i,1) THEN
    differed_str := differed_str||SUBSTR(new_str,i,1);
    END IF;
    i := i + 1;
    END LOOP;
    END;
    So, now ur extra characters in New Field will be :differed_str.
    May be u can give a msg with that string.
    Thanx,
    Cheers,

  • Urgent: comparing multi-byte characters to a single byte character!

    Let's say I have two strings, they have the same contents but use different encoding, how do I compare them?
    String a = "GOLD";
    String b = "G O L D ";
    The method a.equals(b) doesn't seem to work.

    try this:
    String a = "GOLD";
    String b = "G O L D ";
    boolean bEqual = true;
    int iLength = a.length();
    int j = 0;
    for (int i = 0; i < iLength; i++)  {
       while(b.substring(j,1).equals(" "))
          j++;
       if(!a.substring(i, 1).equals(b.substring(j,1))  {
          bEqual = false;
          break;
    }

  • Problem in comparing a character variable to date value.

    Hi All,
                 I have a scenario where I am comparing a variable of type c with a database field which is a date.Now the comparison is failing though it should not.I can't change the variable because I am capturing that from Line selection ie through get cursor.
    So is there any FM or any other way through which i can change this value to database field value type.
    Also variable has date in format 17.12.207 where as in table it is stored as 20071217 i.e YYYYMMDD.
    Thanks in Advance,
    Saket.

    Hi saket,
    Use  as the code below;
    data : chr_date(10) type c value '12.12.2007'.
    data : lf_date type d.
    CALL FUNCTION 'CONVERT_DATE_TO_INTERNAL'
      EXPORTING
        date_external                  = chr_date
    IMPORTING
       DATE_INTERNAL                  = lf_date.
    Now you can compare lf_date with database date field.
    Revert back if u have any doubts.
    Regards
    Karthik D
    Edited by: Karthik D on Sep 20, 2008 7:53 PM

  • Oracle 11g Linguistic NLS SORT Throws Exception

    Hi All,
    I am using oracle 11g and when i try NLS_Sort with Generic_m option, throws ORA-00910 exception. See below for more details
    Select * From v$version
    1 Oracle Database 11g Release 11.1.0.6.0 - Production
    2 PL/SQL Release 11.1.0.6.0 - Production
    3 CORE 11.1.0.6.0 Production
    4 TNS for 32-bit Windows: Version 11.1.0.6.0 - Production
    5 NLSRTL Version 11.1.0.6.0 - Production
    Select * From v$NLS_PARAMETERS;
    1 NLS_LANGUAGE AMERICAN
    2 NLS_TERRITORY AMERICA
    3 NLS_CURRENCY $
    4 NLS_ISO_CURRENCY AMERICA
    5 NLS_NUMERIC_CHARACTERS .,
    6 NLS_CALENDAR GREGORIAN
    7 NLS_DATE_FORMAT DD-MON-RR
    8 NLS_DATE_LANGUAGE AMERICAN
    9 NLS_CHARACTERSET WE8MSWIN1252
    10 NLS_SORT    BINARY
    11 NLS_TIME_FORMAT HH.MI.SSXFF AM
    12 NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
    13 NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
    14 NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
    15 NLS_DUAL_CURRENCY $
    16 NLS_NCHAR_CHARACTERSET AL16UTF16
    17 NLS_COMP    BINARY
    18 NLS_LENGTH_SEMANTICS BYTE
    19 NLS_NCHAR_CONV_EXCP FALSE
    I have one table 'Test' in that column TestDesc varchar2(4000). Now if i retrieve the records by
    select sts, it is successfully executed. The same if i do after exec of the below sts, it is
    throwing ORA-00910:specified length too long for its datatype.
    1. ALTER SESSION SET NLS_SORT=GENERIC_m;
    2. Select * From Test order by TestDesc; (It is throwing ORA-00910 exception)
    But the same query/setup is executed successfully in oracle 10g.
    My question:
    Why it is throwing this exception especially in 11g?
    Do i need to excute any alter sts like changing of charactor set..
    Kindly help me to sove this issue.

    Does that mean that 11.2.0.1 (without pse), NLSSORT does not work as intended (documented)?
    Correct. At least, if the related information in bug reports is correct.
    Is there in 11.2.0.2 still silent truncation instead of "... calculates the collation key for a maximum prefix", if there's a difference?
    There is no difference. The term "silent truncation" is not really precise, so the documentation describes the process in a more elaborate way.
    Shouldn't docs mention that a "calculated result" could mean that sorts may sometimes be out of sequence (in-exact collation)?
    Yes, it should. It is sometimes too easy to assume that things obvious to oneself are also obvious to anybody else ;-) I have asked for the following explanation to be added after the relevant doc paragraph:
    "The above behavior implies that two character values whose collation keys (NLSSORT results) are compared to find the linguistic ordering are considered equal if they do not differ in the prefix described above even though they may differ at some further character position. As the NLSSORT function is used implicitly to find linguistic ordering for comparison conditions, BETWEEN condition, IN condition, ORDER BY, GROUP BY, and COUNT(DISTINCT), those operations may return results that are only approximate for long character values. This is a restriction of the current comparison architecture. Currently, the only way to guarantee precise linguistic comparison results is to not compare character values that are longer than 499 characters for monolingual collations and 124 characters for multilingual collations."
    -- Sergiusz
    Edited by: S. Wolicki, Oracle on May 5, 2011 1:17 PM
    Lowered the pessimistic length for multilingual sorts from 249=floor((2000-3)/8) to 124=floor((2000-3)/16)

  • Obtaining data from a query

    hii everyone
    i have a query which i use in a stored procedure
    query:='select distinct (to_date(substr(f_file_name, 5, 8), ''yyyymmdd'')) fdate
          from IUC_DAT_MSC'|| vmscid ||'_RAFP where F_FILE_NAME
                like ''%RCPA'|| temps||'%'' and to_date(substr(f_file_name, 5, 8), ''yyyymmdd'') between
                to_date(''' || start_date || ''') and to_date(''' || end_date || ''')
                order BY  to_date(substr(f_file_name, 5, 8), ''yyyymmdd'')';the problem is if i give the start and end date as a range(for ex 10 jan 2012,20 jan 2012) i am able to check if
    there are any records present for those date..but if i specify the start and end date as same(for ex 10 jan 2012,10 jan 2012),i am unable to check..is there any way in
    which we can frame the logic for this..
    thanks

    Hi User,
    to_date(''' || start_date || ''') and to_date(''' || end_date || ''') Here the '10 jan 2012' start_date and end_date you have specified are in character format.
    You cannot compare date with character format. It is that you should not compare character date formats
    as it gives undesired results.
    Always, compare date converting the Character Format to DATE using TO_DATE function.
    For Ex:
    SELECT *
      FROM EMP
    WHERE TRUNC (HIREDATE) = TO_DATE ('10 jan 2012', 'DD mon YYYY');Will output records where hiredate date equal to Jan 1 2012.
    Here, the HIREDATE is the date field. and TRUNC(HIREDATE) will remove the time from date.
    Thanks,
    Shankar

  • Wsdlc / xmlbeans - no exception handling

    hi
    when I generate a webservice with wsdlc and the option typeFamily="XMLBEANS_APACHE", I have no exception classes, I mean no classes that extends java.lang.Exception or a throwable class.
    when I generate the webservice without the typeFamily option, I have methods with "...throws SampleException" and this SampleException extends java.lang.Exception.
    I'm using wsdlc from wls10.0.
    thanks for help

    Hi Chen,
    comparing character against integer value is probably bad programming.
    But what about this example:
    CLASS lcl_test DEFINITION.
      PUBLIC SECTION.
        CLASS-METHODS test
          RETURNING
            value(result) TYPE string.
    ENDCLASS.
    CLASS lcl_test IMPLEMENTATION.
      METHOD test.
        result = '4,5'.
      ENDMETHOD.
    ENDCLASS.
    START-OF-SELECTION.
      DATA gv_integer TYPE i.
      TRY.
          gv_integer = lcl_test=>test( ).
        CATCH cx_sy_conversion_no_number.
      ENDTRY.
    Check it out! It also creates a dump although it isn't bad programming.
    Here you can also use the mentioned trick. (At this place I prefer the term workaround.)
    START-OF-SELECTION.
      DATA gv_string TYPE string.
      DATA gv_integer TYPE i.
      TRY.
          gv_string = lcl_test=>test( ).
          gv_integer = gv_string.
        CATCH cx_sy_conversion_no_number.
      ENDTRY.
    Now, here are my thoughts:
    Case 1: Converting string to integer value --> non-catchable exception
    Case 2: Converting string to integer value --> catchable exception
    Confusing?
    Apropos:
    I searched the ABAP-Docu for the term CONVT_NO_NUMBER.
    There are six occurrence and every occurrence called it catchable.
    Conclusions:
    Option 1: SAP knows this behavior but has decided to leave us in ignorance.
    Option 2: This behavior is a bug and needs to be corrected.
    Option 3: This behavior is not a bug but a feature. ;-)
    Regards,
    Hannes

Maybe you are looking for